'标准模块: 
Option Explicit 
Public Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long 
'创建窗口 
Public Declare Function RegisterClassEx Lib "user32" Alias "RegisterClassExA" (pcWndClassEx As WNDCLASSEX) As Long 
'注册窗口类 
Public Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long 
'装载光标 
Public Declare Function LoadIcon Lib "user32" Alias "LoadIconA" (ByVal hInstance As Long, ByVal lpIconName As Long) As Long 
'装载图标 
Public Declare Function UnregisterClass Lib "user32" Alias "UnregisterClassA" (ByVal lpClassName As String, ByVal hInstance As Long) As Long 
'撤消窗口类注册 
Public Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
'默认窗口处理 
Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long 
'显示窗口 
Public Type WNDCLASSEX 
      cbSize          As Long 
      style            As Long 
      lpfnWndProc      As Long 
      cbClsExtra      As Long 
      cbWndExtra      As Long 
      hInstance        As Long 
      hIcon            As Long 
      hCursor          As Long 
      hbrBackground    As Long 
      lpszMenuName    As String 
      lpszClassName    As String 
      hIconSm          As Long 
End Type 
Public Const SW_SHOWNORMAL = &H1 
Public Const IDI_APPLICATION = &H7F00 
Public Const IDC_ARROW = &H7F00 
Public Const COLOR_WINDOW = &H6 
Public Const CS_DBLCLKS = &H8 
Public Const WS_OVERLAPPEDWINDOW = &HCA0000 
Public Const HWND_DESKTOP = &H0 
Public Const szFrameClass = "FrameClass" 
Public lCount As Long 
'-------------------------------------------------------------------------------------- 
Public Function FrameProc(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
      Select Case wMsg 
              Case Else 
                  FrameProc = DefWindowProc(hWnd, wMsg, wParam, lParam)        '默认窗口处理 
      End Select 
End Function 
'-------------------------------------------------------------------------------------- 
Public Function GetAddress(ByVal dwAddress As Long) As Long 
      GetAddress = dwAddress 
End Function 
'类模块 
Option Explicit 
Private hFrame As Long 
'-------------------------------------------------------------------------------------- 
Private Sub Class_Initialize() 
        Dim lpWndClass As WNDCLASSEX 
        With lpWndClass 
            .cbSize = Len(lpWndClass) 
            .hbrBackground = COLOR_WINDOW 
            .hIcon = LoadIcon(0, IDI_APPLICATION) 
            .hIconSm = LoadIcon(0, IDI_APPLICATION) 
            .hCursor = LoadCursor(0, IDC_ARROW) 
            .hInstance = App.hInstance 
            .lpszClassName = szFrameClass 
            .lpszMenuName = "" 
            .style = CS_DBLCLKS 
            .lpfnWndProc = GetAddress(AddressOf FrameProc) 
            .cbWndExtra = 0 
            .cbClsExtra = 0 
        End With 
        Call RegisterClassEx(lpWndClass)                                        '注册Frame窗口类 
        hFrame = CreateWindowEx(0, szFrameClass, "", WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, HWND_DESKTOP, 0, _ 
        App.hInstance, ByVal 0)                                                '创建Frame窗口 
        Call ShowWindow(hFrame, SW_SHOWNORMAL)                                  '显示Frame窗口 
        lCount = lCount + 1                                                    '引用计数加1 
End Sub 
'-------------------------------------------------------------------------------------- 
Private Sub Class_Terminate() 
        lCount = lCount - 1                                                    '引用计数减1 
        If lCount = 0 Then Call UnregisterClass(szFrameClass, App.hInstance)    '撤消Frame窗口类注册(引用计数为0) 
End Sub 
'窗口模块 
Private ee As FrameClass 
Private cc As FrameClass Private Sub Form_Load() 
        Set ee = New FrameClass 
        Set cc = New FrameClass 
End Sub Private Sub Form_Unload(Cancel As Integer) 
        Set ee = Nothing 
        Set cc = Nothing 
End Sub '不能将窗口处理函数FrameProc作为每个类对象的私有数据,请高手指教!

解决方案 »

  1.   

    小弟还是搞不定(看VB高级编程,看得头都大了,一点收获也没有,主要是VB技术不够),请高手再给点提示,最好是源码.
      

  2.   

       调用FrameProc函数只有这一句  .lpfnWndProc = GetAddress(AddressOf FrameProc)
    调用时使用了AddressOf,按AddressOf的使用方法FrameProc函数必须放在标准模块,不得放在类模块和窗体模块,你将FrameProc函数放在标准模块不就行了Public Function FrameProc(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
          Select Case wMsg 
                  Case Else 
                      FrameProc = DefWindowProc(hWnd, wMsg, wParam, lParam)        '默认窗口处理 
          End Select 
    End Function 

    要放在标准模块里
     
      

  3.   

    不行的.我做的是一个窗口类,如果这样的话,我创建两个以上的对象时,有些数据就变成公有的了.比如: 在WM_LBUTTONDOWN时,在每个对象上加载一幅不同的位图的话,你想结果会如何?那显示的肯定是同一幅位图.
      

  4.   

    你说这倒是个事实,你的这个类模块只有一个私有数据hFrame,也没有任何公共接口,所有的数据都从标准模块调用,应该给类建立几个公共接口,将你的数据传进去,至少要有自己的私有数据吧
      

  5.   

    他们说《高级 Visual Basic 编程》里通过查找VTable可以实现.
      

  6.   


    WM_LBUTTONDOWN时你怎么传进去.
      

  7.   

    WM_LBUTTONDOWN好象是消息类常数,常数放在类模块或标准模块中都行,不存在传进传出的问题
      

  8.   

    你理解错了
    Public Function FrameProc(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
          Select Case wMsg 
                  Case WM_LBUTTONDOWN
                       '显示图片
                  Case Else 
                      FrameProc = DefWindowProc(hWnd, wMsg, wParam, lParam)        '默认窗口处理 
          End Select 
    End Function 
      

  9.   

    如果是这样的问题 似乎FrameProc再增加一个参数,传递一个图片地址给FrameProc就行了