'标准模块:
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 FrameClassPrivate Sub Form_Load()
        Set ee = New FrameClass
        Set cc = New FrameClass
End SubPrivate Sub Form_Unload(Cancel As Integer)
        Set ee = Nothing
        Set cc = Nothing
End Sub'不能将窗口处理函数FrameProc作为每个类对象的私有数据,请高手指教!

解决方案 »

  1.   

    主要是因为Addressof运算符不能传类模块函数地址,请问有什么更好的办法,小弟非常急!在此先谢了.
      

  2.   

    Addressof只能用于模块中的方法,类的成员地址需要通过查找VTAB取得,应该只有找到类中过程的地址才可以,可以参考一下《高级 Visual Basic 编程》
      

  3.   

    《高级 Visual Basic 编程》电子版送给楼主修炼
    http://download.csdn.net/source/164263
      

  4.   

    语法AddressOf procedurename必需的 procedurename 指定要传递的地址是哪一个过程的地址。这个过程必须是发出调用命令的工程中的一个标准模块模块里的一个过程。
      

  5.   

    .lpfnWndProc = GetAddress(AddressOf FrameProc) 
    不能这么用,就不用!
    增加一个属性,要求用户传入窗口处理函数源地址!
      

  6.   

    多谢了,但是网上找不到VBoost.bas