UID 5408
精华
积分 185
威望 点
宅币 个
贡献 次
宅之契约 份
最后登录 1970-1-1
在线时间 小时
本帖最后由 马云爱逛京东 于 2021-3-6 19:32 编辑
原作地址
七年前,43605发布了一个帖子,简单介绍了用win32api创建窗口的方法。
今天,我对他的代码增加了一些注释,以及微小的扩充。
3月6日更新:简单封装了一些过程
这是第一个模块的代码,也是其主要部分。其中的事件可以在WndProc里面自行添加。
想要什么控件可以自己画,都是现成的。
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
Option Explicit
'发送终止信息
Private Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long)
'调用窗口过程
Private Declare Function CallWindowProcess Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'加载光标
Private Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As eCursor) As Long
'加载图标
Private Declare Function LoadIcon Lib "user32" Alias "LoadIconA" (ByVal hInstance As Long, ByVal lpIconName As eIcon) As Long
'创建实色画刷
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
'删除对象(画刷)
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
'注册窗口类扩展
Private Declare Function RegisterClassEx Lib "user32" Alias "RegisterClassExA" (pcWndClassEx As WindowClassEx) As Integer
'注册窗口类
Public Declare Function RegisterClass Lib "user32" Alias "RegisterClassA" (Class As WindowClassEx) As Long
'反注册窗口类
Public Declare Function UnregisterClass Lib "user32" Alias "UnregisterClassA" (ByVal lpClassName As String, ByVal hInstance As Long) As Long
'移动窗口
Private Declare Function MoveWindow Lib "user32" (ByVal HWnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
'拷贝内存
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef pDest As Any, ByRef pSrc As Any, ByVal mLength 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 GetMessage Lib "user32" Alias "GetMessageA" (MsgInfo As Msg, ByVal HWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
'MsgInfo:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。
'hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。
'wMsgFilterMin: 指定被检索的最小消息值的整数。
'wMsgFilterMax: 指定被检索的最大消息值的整数。
'翻译消息:将虚拟键消息转换为字符消息
Public Declare Function TranslateMessage Lib "user32" (MsgInfo As Msg) As Long
'派送消息:将消息派送给窗口过程。通常情况下被用来派送GetMessage函数获得的消息。
Public Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (MsgInfo As Msg) As Long
'显示窗口
Public Declare Function ShowWindow Lib "user32" (ByVal HWnd As Long, ByVal nCmdShow As eShowWindow) As Long
'改变指定窗口的属性。函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As eWindowLong, ByVal dwNewLong As Long) As Long
'hWnd: 窗口句柄及间接给出的窗口所属的类。
'nlndex:指定将设定的大于等于0的偏移值。有效值的范围从0到额外类的存储空间的字节数-4:例如若指定了12位或多于12位的额外类存储空间,则应设为第三个32位整数的索引位8。要设置其他任何值,可以指定下面值之一:
'dwNewLong: 指定的替换值。
'返回值:如果函数成功,返回值是指定的32位整数的原来的值。如果函数失败,返回值为0。
'获取指定窗口的有关信息。也可用于获取窗口内存中指定偏移的32位度整型值。
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As eWindowLong) As Long
'消息框
Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal HWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
'创建窗口扩展
Private 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
'dwExStyle:指定窗口的扩展风格。详见eDrawExtendStyle枚举。
'IpClassName:指向一个空结束的字符串或整型数atom。如果该参数是一个整型量,它是由此前调用theGlobaIAddAtom函数产生的全局量。这个小于OxCOOO的16位数必须是IpClassName参数字的低16位,该参数的高位必须是O。如果lpClassName是一个字符串,它指定了窗口的类名。这个类名可以是任何用函数RegisterClassEx注册的类名,或是任何预定义的控制类名。请看说明部分的列表。
'lpWinDowname:指向一个指定窗口名的空结束的字符串指针。如果窗口风格指定了标题条,由lpWinDowname指向的窗口标题将显示在标题条上。当使用CreateWindow函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本。
'dwStyle:指定创建窗口的风格。详见见eDrawBasicStyle枚举。
'X:指定窗口的初始水平位置。对一个层叠或弹出式窗口,X参数是屏幕坐标系的窗口的左上角的初始X坐标。对于子富口,x是子窗口左上角相对父窗口客户区左上角的初始X坐标。如果该参数被设为CW_UCEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略Y参数。CW_USEDEFAULT只对层叠窗口有效,如果为弹出式窗口或子窗口设定,则X和y参数被设为零。
'Y:指定窗口的初始垂直位置。对一个层叠或弹出式窗日,y参数是屏幕坐标系的窗口的左上角的初始y坐标。对于子窗口,y是子窗口左上角相对父窗口客户区左上角的初始y坐标。对于列表框,y是列表框客户区左上角相对父窗口客户区左上角的初始y坐标。如果层叠窗口是使用eVisible风格位创建的并且X参数被设为CW_USEDEFAULT,则系统将忽略y参数。
'nWidth:以设备单元指明窗口的宽度。对于层叠窗口,nWidth或是屏幕坐标的窗口宽度或是CW_USEDEFAULT。若nWidth是CW_USEDEFAULT,则系统为窗口选择一个缺省的高度和宽度:缺省宽度为从初始X坐标开始到屏幕的右边界,缺省高度为从初始X坐标开始到目标区域的顶部。CW_USEDFEAULT只参层叠窗口有效:如果为弹出式窗口和子窗口设定CW_USEDEFAULT标志则nWidth和nHeight被设为零。
'nHelght:以设备单元指明窗口的高度。对于层叠窗口,nHeight是屏幕坐标的窗口宽度。若nWidth被设为CW_USEDEFAULT,则系统忽略nHeight参数。
'hWndParent:指向被创建窗口的父窗口或所有者窗口的旬柄。若要创建一个子窗口或一个被属窗口,需提供一个有效的窗口句柄。这个参数对弹出式窗日是可选的。Windows NT 5.0:创建一个消息窗口,可以提供hWnd_MESSAGE或提供一个己存在的消息窗口的句柄。
'hMenu:菜单句柄,或依据窗口风格指明一个子窗口标识。对于层叠或弹出式窗口,hMenu指定窗口使用的菜单:如果使用了菜单类,则hMenu可以为NULL。对于子窗口,hMenu指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的。
'hlnstance:应用程序实例的句柄。
'lpParam:指向一个值的指针,该值传递给窗口 WM_CREATE消息。该值通过在IParam参数中的CREATESTRUCT结构传递。如果应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构。
'销毁窗口
Private Declare Function DestroyWindow Lib "user32" (ByVal HWnd As Long) As Long
'传递消息
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal HWnd As Long, ByVal wMsg As eWindowMessage, Optional ByVal wParam As Long = 0, Optional lParam As Any = vbNull) As Long
'hWnd:窗口句柄
'wMsg:消息类型。见eWindowMessage枚举
'wParam:用来存储小段信息,如,标志
'lParam:用于存储消息所需的对象
'获得API错误信息
Public Declare Function GetLastError Lib "kernel32" () As Long
'获得设备上下文(DC)句柄
Private Declare Function GetDC Lib "user32" (ByVal HWnd As Long) As Long
'释放设备上下文(DC)句柄
Private Declare Function ReleaseDC Lib "user32" (ByVal HWnd As Long, ByVal hDC As Long) As Long
'获得窗口类的项目
Private Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (ByVal HWnd As Long, ByVal Item As eWindowClassItem) As Long
'获得整个窗口的矩形
Private Declare Function GetWindowRect Lib "user32" (ByVal HWnd As Long, lpRect As RectLayoutAPI) As Long
'获得窗口客户区的矩形
Private Declare Function GetClientRect Lib "user32" (ByVal HWnd As Long, lpRect As RectLayoutAPI) As Long
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
Private lPrevWndProc As Long '之前的回调结果
Private MsgInfo As Msg '窗口消息
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
'ClassName窗口类的常量声明
Public Const ClassMenu As String = "#32768" '菜单
Public Const ClassDesktopWindow As String = "#32769" '桌面窗口
Public Const ClassDialog As String = "#32770" '对话框窗口
Public Const ClassTaskbarSwitcher As String = "#32771" '任务栏切换窗口
Public Const ClassIconOnWindowTitleBar As String = "#32772" '标题栏的图标
Public Const ClassMessage As String = "Message" '消息框窗口
Public Const ClassDDEMLEvent As String = "DDEMLEvent" '动态数据交换管理库(DDEML)事件窗口
Public Const ClassComboListBox As String = "ComboLBox" '组合列表框
Public Const ClassListBox As String = "ListBox" '列表框
Public Const ClassTextBox As String = "Edit" '编辑框
Public Const ClassComboBox As String = "ComboBox" '组合框
Public Const ClassCommandButton As String = "Button" '按钮
Public Const ClassScrollBar As String = "ScrollBar" '滚动条
Public Const ClassStaticControl As String = "Static" '静态控件
Public Const ClassMDIClilent As String = "MDIClient" 'MDI窗口
Public Const ClassIPv4AddressBar As String = "SysIPAddress32" 'IPv4地址栏
Public Const ClassStatusBar As String = "msctls_statusbar32" '状态栏
Public Const ClassToolBar As String = "ToolbarWindow32" '工具栏
Public Const ClassListView As String = "SysListView32" '多列列表框
Public Const ClassTreeView As String = "SysTreeView32" '树状管理框
'用于位置的常量声明
Public Const CurrentWindowPositionUseDefaultConfig = &H80000000
'系统内部颜色常量
Public Const sysColorScrollBar As Long = 0
Public Const sysColorBackground As Long = 1
Public Const sysColorActiveCaption As Long = 2
Public Const sysColorInactiveCaption As Long = 3
Public Const sysColorMenu As Long = 4
Public Const sysColorWindow As Long = 5
Public Const sysColorWindowFrame As Long = 6
Public Const sysColorMenuText As Long = 7
Public Const sysColorWindowText As Long = 8
Public Const sysColorCaptionText As Long = 9
Public Const sysColorActiveBorder As Long = 10
Public Const sysColorInactiveBorder As Long = 11
Public Const sysColorAppWorkspaceE As Long = 12
Public Const sysColorHighLight As Long = 13
Public Const sysColorHighLightText As Long = 14
Public Const sysColorButtonFace As Long = 15
Public Const sysColorButtonShadow As Long = 16
Public Const sysColorGrayText As Long = 17
Public Const sysColorButtonText As Long = 18
Public Const sysColorInactiveCaptionText As Long = 19
Public Const sysColorButtonHighLight As Long = 20
Public Const sysColor3dDarkShadow As Long = 21
Public Const sysColor3dLight As Long = 22
Public Const sysColorInfoText As Long = 23
Public Const sysColorInfoBackground As Long = 24
Public Const sysColorHotLight As Long = 26
Public Const sysColorGradientActiveCaption As Long = 27
Public Const sysColorGradientInactiveCaption As Long = 28
Public Const sysColorMenuHighLight As Long = 29
Public Const sysColorMenuBar As Long = 30
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
Public Enum eDrawExtendStyle '扩展样式
eAcceptFiles = &H10& 'eAcceptFiles:指定以该风格创建的窗口接受一个拖拽文件。
eAppWindow = &H40000 'eAppWindow:当窗口可见时,将一个顶层窗口放置到任务条上。
eClientEdge = &H200& 'eClientEdge:指定窗口有一个带阴影的边界。
eComPositionited = &H2000000 'eComPositionited:指定复合窗口。
eContextHelp = &H400& 'eContextHelp:在窗口的标题条包含一个问号标志。当用户点击了问号时,鼠标光标变为一个问号的指针。如果点击了一个子窗口,则子窗日接收到WM_Help消息。子窗口应该将这个消息传递给父窗口过程,父窗口再通过Help_WM_Help命令调用WinHelp函数。这个Help应用程序显示一个包含子窗口帮助信息的弹出式窗口。 eContextHelp不能与eMaxmizeBox和eMinimizeBox同时使用。
eControlParent = &H10000 'eControlParent:允许用户使用Tab键在窗口的子窗口间搜索。
eDefault = &H0& 'eDefault:缺省设置(不使用额外样式)。
eDialogModalFrame = &H1& 'eDialogModalFrame:创建一个带双边的窗口:该窗口可以在dwStyle中指定eCaption风格来创建一个标题栏。
eLayered = &H80000 'eLayered:指定窗口是分层的。
eLayoutRightToLeft = &H400000 'eLayoutRightToLeft:创建一个水平原点位于右边缘的窗口。水平值增加到左侧。
eLeft = &H0& 'eLeft:窗口具有左对齐属性,这是缺省设置的。
eLeftScrollBar = &H4000& 'eLeftScrollBar:如果语言是如Hebrew,Arabic,或其他支持reading order alignment的语言,则标题条(如果存在)则在客户区的左部分。若是其他语言,在该风格被忽略并且不作为错误处理。
eLeftToRightReading = &H0& 'eLeftToRightReading:窗口文本以LEFT到RIGHT(自左向右)属性的顺序显示。这是缺省设置的。
eMDIChild = &H40& 'eMDIChild:创建一个MDI子窗口。
eNoActivate = &H8000000 'eNoActivate:创建一个未被激活的窗口。
eNoInheritLayout = &H100000 'eNoInheritLayout:创建一个无法继承的布局窗口。
eNoParentNotify = &H4& 'eNoParentNotify:指明以这个风格创建的窗口在被创建和销毁时不向父窗口发送WM_PARENTNOTFY消息。
eNoRedirectionBitmap = &H200000 'eNoRedirectionBitmap:指定窗口没有重定向的位图。
eRight = &H1000& 'eRight:窗口具有普通的右对齐属性,这依赖于窗口类。只有在外壳语言是如Hebrew,Arabic或其他支持读顺序对齐(reading order alignment)的语言时该风格才有效,否则,忽略该标志并且不作为错误处理。
eRightScrollBar = &H0& 'eRightScrollBar:垂直滚动条在窗口的右边界。这是缺省设置的。
eRightToLeftReading = &H2000& 'eRightToLeftReading:如果外壳语言是如Hebrew,Arabic,或其他支持读顺序对齐(reading order alignment)的语言,则窗口文本是一自左向右)RIGHT到LEFT顺序的读出顺序。若是其他语言,在该风格被忽略并且不作为错误处理。
eStaticEdge = &H20000 'eStaticEdge:为不接受用户输入的项创建一个三维边界风格
eToolWindow = &H80& 'eToolWindow:创建工具窗口,即窗口是一个游动的工具条。工具窗口的标题条比一般窗口的标题条短,并且窗口标题以小字体显示。工具窗口不在任务栏里显示,当用户按下alt+Tab键时工具窗口不在对话框里显示。如果工具窗口有一个系统菜单,它的图标也不会显示在标题栏里,但是,可以通过点击鼠标右键或Alt+Space来显示菜单。
eTopMost = &H8 'eTopMost:指明以该风格创建的窗口应放置在所有非最高层窗口的上面并且停留在其L,即使窗口未被激活。使用函数SetWindowPosition来设置和移去这个风格。
eTransparent = &H20& 'eTransparent:指定以这个风格创建的窗口在窗口下的同属窗口已重画时,该窗口才可以重画。由于其下的同属窗口已被重画,该窗口是透明的。
eWindowEdge = &H100& 'eWindowEdge:指定窗口具有边框。
eWindowClientEdge = eWindowEdge Or eClientEdge 'eWindowClientEdge:eClientEdge和eWindowEdge的组合。
ePaletteWindow = eWindowEdge Or eToolWindow Or eTopMost 'ePaletteWindow:调色板窗口。eWindowEdge, eToolWindow和eTopMost风格的组合
End Enum
Public Enum eDrawBasicStyle '基本样式
eBorder = &H800000 'eBorder:创建一个单边框的窗口。
eCaption = &HC00000 'eCaption:创建一个有标题框的窗口(包括eBorder风格)。
eChild = &H40000000 'eChild:创建一个子窗口。这个风格不能与ePopup风格合用。
eClipChildren = &H2000000 'eClipChildren:当在父窗口内绘图时,排除子窗口区域。在创建父窗口时使用这个风格。
eClipSiblings = &H4000000 'eClipSiblings:排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到WM_PAINT消息时,eClipSiblings 风格将所有层叠窗口排除在绘图之外,只重绘指定的子窗口。如果未指定eClipSiblings风格,并且子窗口是层叠的,则在重绘子窗口的客户区时,就会重绘邻近的子窗口。
eDisabled = &H8000000 'eDisabled:创建一个初始状态为禁止的子窗口。一个禁止状态的窗日不能接受来自用户的输人信息。
eDialogFrame = &H400000 'eDialogFrame:创建一个带对话框边框风格的窗口。这种风格的窗口不能带标题条。
eGroUp = &H20000 'eGroUp:指定一组控制的第一个控制。这个控制组由第一个控制和随后定义的控制组成,自第二个控制开始每个控制,具有eGroUp风格,每个组的第一个控制带有eTabStop风格,从而使用户可以在组间移动。用户随后可以使用光标在组内的控制间改变键盘焦点。
eHorizontalScrollBar = &H100000 'eHorizontalScrollBar:创建一个有水平滚动条的窗口。
eMaxmize = &H1000000 'eMaxmize:创建一个具有最大化按钮的窗口。该风格不能与eContextHelp风格同时出现,同时必须指定eSystemtemMenu风格。
eMaxmizeBox = &H10000 'eMaxmizeBox:创建一个允许最大化的窗口。
eMinimize = &H20000000 'eMinimize:创建一个具有最小化按钮的窗口。该风格不能与eContextHelp风格同时出现,同时必须指定eSystemtemMenu风格。
eMinimizeBox = &H20000 'eMinimizeBox:创建一个允许最小化的窗口。
eOverLapped = &H0& 'eOverLapped:产生一个层叠的窗口。一个层叠的窗口有一个标题条和一个边框。与eTiled风格相同。
ePopup = &H80000000 'ePopup:创建一个弹出式窗口。该风格不能与eChild风格同时使用。
eSystemtemMenu = &H80000 'eSystemtemMenu:创建一个在标题条上带有窗口菜单的窗口,必须同时设定eCaption风格。
eTabStop = &H10000 'eTabStop:创建一个控制,这个控制在用户按下Tab键时可以获得键盘焦点。按下Tab键后使键盘焦点转移到下一具有eTabStop风格的控制。
eThickFrame = &H40000 'eThickFrame:创建一个具有可调边框的窗口,与eSizeBox风格相同。
eVisible = &H10000000 'eVisible:创建一个初始状态为可见的窗口。
eVerticalScrollBar = &H200000 'eVerticalScrollBar:创建一个有垂直滚动条的窗口。
eChildWindow = eChild 'eChildWindow:创建一个子窗口。与eChild风格相同。
eIconic = eMinimize 'eIconic:创建一个初始状态为最小化状态的窗口。与eMinimize风格相同。
eOverLappedWindow = eOverLapped Or eCaption Or eSystemtemMenu Or eThickFrame Or eMinimizeBox Or eMaxmizeBox 'eOverLappedWindow:创建一个具有eOverLapped,eCaption,eSystemtemMenu eThickFrame,eMinimizeBox,eMaxmizeBox风格的层叠窗口,与eTiledWindow风格相同。
ePopupWindow = ePopup Or eBorder Or eSystemtemMenu 'ePOPUWindow:创建一个具有eBorder,ePopup,eSystemtemMenu风格的窗口,eCaption和ePopupWindow必须同时设定才能使窗口某单可见。
eSizeBox = eThickFrame 'eSizeBox:创建一个可调边框的窗口,与eThickFrame风格相同。
eTiled = eOverLapped 'eTiled:产生一个层叠的窗口。一个层叠的窗口有一个标题和一个边框。与eOverLapped风格相同。
eTiledWindow = eOverLappedWindow 'eTiledWindow:创建一个具有eOverLapped,eCaption,eSystemtemMenu, MS_THICKFRAME, eMinimizeBox,eMaxmizeBox风格的层叠窗口。与eOverLappedWindow风格相同。
End Enum
Public Enum eCursor '光标
eCursorArrow = 32512& '正常
eCursorBackground = 32650& '后台运行,鼠标旁边带沙漏
eCursorCross = 32515& '十字
eCursorHand = 32649& '手型
eCursorQuestion = 32651& '帮助选择,鼠标旁边带问号
eCursorEdit = 32513& '工(I)字,用于编辑
eCursorForbid = 32648& '禁止
eCursorSize = 32646& '调节大小,即四个方向的箭头
eCursorSizeDiagonal2 = 32643& '对角线2,即东北-西南方向↙↗
eCursorSizeDiagonal1 = 32642& '对角线1,即西北-东南方向↖↘
eCursorSizeNorthSouth = 32645& '竖直,即北-南方向
eCursorSizeEastWest = 32644& '水平,即东-西方向
eCursorSizeBusy = 32514& '忙碌,即沙漏
End Enum
Public Enum eIcon '图标
eIconApplication = 32512& '应用程序的图标
eIconInfomation = 32516& '蓝色圆形+字母i图标(提示信息)
eIconError = 32513& '红色圆形+叉号图标(错误)
eIconWarning = 32515& '黄色三角形+感叹号图标(警告)
eIconQuestion = 32514& '蓝色圆形+问号图标(询问)
eIconShield = 32518& '盾牌图标(管理员)
eIconWinLogo = 32517& 'Windows的logo(Win10没有作用)
End Enum
Public Enum eWindowSize '窗口形状
eWindowSizeRestored = 0 '还原
eWindowSizeMinimized = 1 '最小化
eWindowSizeMaxinized = 2 '最大化
eWindowSizeShow = 3 '显示
eWindowSizeHide = 4 '隐藏
End Enum
Public Enum eClassStyle '窗口类样式
eClassStyleVerticalRedraw = &H1& '如果窗口的位置或高度发生改变,将重绘窗口
eClassStyleHorizontalRedraw = &H2& '如果窗口的位置或宽度发生改变,将重绘窗口
eClassStyleDoubleClicks = &H8& '当用户双击窗口时,将向窗口函数发送鼠标双击消息
eClassStyleOwnDeviceContext = &H20& '为同一个窗口类中的每个窗口创建一个唯一的设备上下文
eClassStyleClassDeviceContext = &H40& '分配一个设备环境并被类中的所有窗体共享。它是可以适用于一个应用程序的若干线程创建的一个相同类的窗体。当多个线程试图同时使用相同的设备环境时,系统只允许一个线程成功地进行绘图操作
eClassStyleParentDeviceContext = &H80& '设置子窗口中剪下的矩形区域到父窗口中,以使子窗口可以在父窗口上绘图。指定该风格可以提高应用程序的性能
eClassStyleNoCloseButton = &H200& '窗口中的“关闭”按钮不可见
eClassStyleSaveBits = &H800& '把被窗口遮掩的屏幕图像作为位图保存起来。当该窗口被移动时,Windows操作系统使用被保存的位图来重建屏幕图像
eClassStyleByteAlignClient = &H1000& '窗口的客户区域以“字符边界”对齐,当系统调整窗口的水平位置时,客户区域的左边坐标是8的整数倍
eClassStyleByteAlignWindow = &H2000& '窗口以“字符边界”对齐,当系统调整窗口的水平位置时,客户区域的左边坐标是8的整数倍
eClassStyleGlobalClass = &H4000& '指定此窗体类是一个应用程序全局类。应用程序全局类是由一个在进程中对所有模块有效的exe或dll注册的窗体类
eClassStyleIME = &H10000 '输入法(尚不明确)
eClassStyleDropShadow = &H20000 '窗体投影(尚不明确)
eClassStyleResizeRedraw = eClassStyleVerticalRedraw Or eClassStyleHorizontalRedraw '如果窗口的位置或大小发生改变,将重绘窗口
End Enum
Public Enum eWindowClassItem '窗口类项目
eWindowClassItemMenuName = (-8) '类菜单取得名称或资源ID
eWindowClassItemHBrushBackground = (-10) '描绘这个类每个窗口的背景时,使用的默认刷子的句柄
eWindowClassItemHCursor = (-12) '指向这个类窗口默认光标的句柄
eWindowClassItemHIcon = (-14) '这个类中窗口默认图标的句柄
eWindowClassItemHModule = (-16) '这个类的模块的句柄
eWindowClassItemWindowExtra = (-18) '窗口结构里为这个类中每个窗口分配的额外字节数
eWindowClassItemClassExtra = (-20) '这个类结构中分配的额外字节数
eWindowClassItemWndProc = (-24) '取得类窗口函数(该类窗口的默认窗口函数)的地址
eWindowClassItemStyle = (-26) '这个类的样式
eWindowClassItemAtom = (-32) '一个唯一标识窗口类的原子值,该值与RegiterClassEx函数的返回值相同。
eWindowClassItemHIconInTaskbar = (-34) '这个类的任务栏图标
End Enum
Public Enum eWindowMessage '窗口消息
eWindowMessageCreate = &H1& '创建一个窗口
eWindowMessageDestory = &H2& '当一个窗口被破坏时发送
eWindowMessageMove = &H3& '移动一个窗口
eWindowMessageSize = &H5& '改变一个窗口的大小
eWindowMessageActivate = &H6& '一个窗口被激活或失去激活状态
eWindowMessageSetFocus = &H7& '一个窗口获得焦点
eWindowMessageLoseFocus = &H8& '一个窗口失去焦点
eWindowMessageEnable = &HA& '一个窗口改变成Enable状态
eWindowMessageSetRedraw = &HB& '设置窗口是否能重画
eWindowMessageSetText = &HC& '应用程序发送此消息来设置一个窗口的文本
eWindowMessageGetText = &HD& '应用程序发送此消息来复制对应窗口的文本到缓冲区
eWindowMessageGetTextLength = &HE& '得到与一个窗口有关的文本的长度(不包含空字符)
eWindowMessagePaint = &HF& '要求一个窗口重画自己
eWindowMessageClose = &H10& '当一个窗口或应用程序要关闭时发送一个信号
eWindowMessageQueryEndSession = &H11& '当用户选择结束对话框或程序自己调用ExitWindows函数
eWindowMessageQuit = &H12& '用来结束程序运行
eWindowMessageQueryOpen = &H13& '当用户窗口恢复以前的大小位置时,把此消息发送给某个图标
eWindowMessageEraseBackground = &H14& '当窗口背景必须被擦除时(例在窗口改变大小时)
eWindowMessageSystemtemColorChange = &H15& '当系统颜色改变时,发送此消息给所有顶级窗口
eWindowMessageEndSession = &H16& '当系统进程发出eWindowMessageQueryENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束
eWindowMessageShowWindow = &H18& '当隐藏或显示窗口是发送此消息给这个窗口
eWindowMessageActivateApp = &H1C& '发此消息给应用程序哪个窗口是激活的,哪个是非激活的
eWindowMessageFontChange = &H1D& '当系统的字体资源库变化时发送此消息给所有顶级窗口
eWindowMessageTimeChange = &H1E& '当系统的时间变化时发送此消息给所有顶级窗口
eWindowMessageCancelMode = &H1F& '发送此消息来取消某种正在进行的摸态(操作)
eWindowMessageSetCursor = &H20& '如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口
eWindowMessageMouseActivate = &H21& '当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
eWindowMessageChildActivate = &H22& '发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小
eWindowMessageQueueSynchronize = &H23& '此消息由基于计算机的训练程序发送,通过WH_JournaLPALYBACK的hook程序分离出用户输入消息
eWindowMessageGetMinMaxInfo = &H24& '此消息发送给窗口当它将要改变大小或位置
eWindowMessagePaintIcon = &H26& '发送给最小化窗口当它图标将要被重画
eWindowMessageIconEraseBackground = &H27& '此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画
eWindowMessageNextDialogControl = &H28& '发送此消息给一个对话框程序去更改焦点位置
eWindowMessageSpoolerStatus = &H2A& '每当打印管理列队增加或减少一条作业时发出此消息
eWindowMessageDrawItem = &H2B& '当button,combobox,listbox,Menu的可视外观改变时发送
eWindowMessageMeasureItem = &H2C& '当button, combo box, list box, list view control, or Menu Item 被创建时
eWindowMessageVirtualKeyToItem = &H2E& '此消息有一个LBS_WANTKeyBOARDInput风格的发出给它的所有者来响应eWindowMessageKeyDown消息
eWindowMessageCharacteracterToItem = &H2F& '此消息由一个LBS_WANTKeyBOARDInput风格的列表框发送给他的所有者来响应eWindowMessageCharacter消息
eWindowMessageSetFont = &H30& '当绘制文本时程序发送此消息得到控件要用的颜色
eWindowMessageGetFont = &H31& '应用程序发送此消息得到当前控件绘制文本的字体
eWindowMessageSetHotKey = &H32& '应用程序发送此消息让一个窗口与一个热键相关连
eWindowMessageGetHotKey = &H33& '应用程序发送此消息来判断热键与某个窗口是否有关联
eWindowMessageQueryDragIcon = &H37& '此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标
eWindowMessageCompareItem = &H39& '发送此消息来判定combobox或listbox新增加的项的相对位置
eWindowMessageCompacting = &H41& '显示内存已经很少了
eWindowMessageWindowPositionChanging = &H46& '发送此消息给那个窗口的大小和位置将要被改变时,来调用SetWindowPosition函数或其它窗口管理函数
eWindowMessageWindowPositionChanged = &H47& '发送此消息给那个窗口的大小和位置已经被改变时,来调用SetWindowPosition函数或其它窗口管理函数
eWindowMessagePower = &H48& '当系统将要进入暂停状态时发送此消息
eWindowMessageCopyData = &H4A& '当一个应用程序传递数据给另一个应用程序时发送此消息
eWindowMessageCancelJourna = &H4B& '当某个用户取消程序日志激活状态,提交此消息给程序
eWindowMessageNotify = &H4E& '当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口
eWindowMessageInputLanguageChangeRequest = &H50& '当用户选择某种输入语言,或输入语言的热键改变
eWindowMessageInputLanguageChange = &H51& '当平台现场已经被改变后发送此消息给受影响的最顶级窗口
eWindowMessageToCard = &H52& '当程序已经初始化Windows帮助例程时发送此消息给应用程序
eWindowMessageHelp = &H53& '此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
eWindowMessageUserChanged = &H54& '当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息
eWindowMessageNotifyFormat = &H55& '公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICode结构
eWindowMessageContextMenu = &H7B& '当用户某个窗口中点击了一下右键就发送此消息给这个窗口
eWindowMessageStyleChanging = &H7C& '当调用SetWindowLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口
eWindowMessageStyleChanged = &H7D& '当调用SetWindowLONG函数一个或多个 窗口的风格后发送此消息给那个窗口
eWindowMessageDisplayChange = &H7E& '当显示器的分辨率改变后发送此消息给所有的窗口
eWindowMessageGetIcon = &H7F& '此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄
eWindowMessageSetIcon = &H80& '程序发送此消息让一个新的大图标或小图标与某个窗口关联
eWindowMessageNonClientCreate = &H81& '当某个窗口第一次被创建时,此消息在eWindowMessageCREATE消息发送前发送
eWindowMessageNonClientDestory = &H82& '此消息通知某个窗口,非客户区正在销毁
eWindowMessageNonClientCalculateSize = &H83& '当某个窗口的客户区域必须被核算时发送此消息
eWindowMessageNonClientHitTest = &H84& '移动鼠标,按住或释放鼠标时发生
eWindowMessageNonClientPaint = &H85& '程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时
eWindowMessageNonClientActivate = &H86& '此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态
eWindowMessageGetDialogCode = &H87& '发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件通过应
eWindowMessageNonClientMouseMove = &HA0& '当光标在一个窗口的非客户区内移动时发送此消息给这个窗口 非客户区为:窗体的标题栏及窗 的边框体
eWindowMessageNonClientLeftButtonDown = &HA1& '当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息
eWindowMessageNonClientLeftButtonUp = &HA2& '当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息
eWindowMessageNonClientLeftButtonDoubleClick = &HA3& '当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息
eWindowMessageNonClientRightButtonDown = &HA4& '当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息
eWindowMessageNonClientRightButtonUp = &HA5& '当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息
eWindowMessageNonClientRightButtonDoubleClick = &HA6& '当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息
eWindowMessageNonClientMiddleButtonDown = &HA7& '当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息
eWindowMessageNonClientMiddleButtonUp = &HA8& '当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息
eWindowMessageNonClientMiddleButtonDoubleClick = &HA9& '当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息
eWindowMessageKeyFirst = &H100& 'eWindowMessageKeyDown 按下一个键
eWindowMessageKeyUp = &H101& '释放一个键
eWindowMessageCharacter = &H102& '按下某键,并已发出eWindowMessageKeyDown, eWindowMessageKeyUp消息
eWindowMessageDeadCharacter = &H103& '当用translatemessage函数翻译eWindowMessageKeyUp消息时发送此消息给拥有焦点的窗口
eWindowMessageSystemKeyDown = &H104& '当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口
eWindowMessageSystemKeyUp = &H105& '当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口
eWindowMessageSystemCharacter = &H106& '当eWindowMessageSystemKeyDown消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口
eWindowMessageSystemDeadCharacter = &H107& '当eWindowMessageSystemKeyDown消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口
eWindowMessageInitializeDialog = &H110& '在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务
eWindowMessageCommand = &H111& '当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译
eWindowMessageSystemCommand = &H112& '当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息
eWindowMessageTimer = &H113& '发生了定时器事件
eWindowMessageHorizontalScrollBar = &H114& '当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件
eWindowMessageVerticalScrollBar = &H115& '当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件
eWindowMessageInitializeMenu = &H116& '当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单
eWindowMessageInitializeMenuPopup = &H117& '当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部
eWindowMessageMenuSelect = &H11F& '当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)
eWindowMessageMenuCharacter = &H120& '当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者
eWindowMessageEnterIdle = &H121& '当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待
eWindowMessageControlColorMessageBox = &H132& '在Windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色
eWindowMessageControlColorTextBox = &H133& '当一个编辑型控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色
eWindowMessageControlColorListBox = &H134& '当一个列表框控件将要被绘制前发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色
eWindowMessageControlColorButton = &H135& '当一个按钮控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色
eWindowMessageControlColorDialog = &H136& '当一个对话框控件将要被绘制前发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色
eWindowMessageControlColorScrollBar = &H137& '当一个滚动条控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色
eWindowMessageControlColorStatic = &H138& '当一个静态控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以 通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色
eWindowMessageMouseFirst = &H200& '移动鼠标时发生
eWindowMessageMouseMove = &H200& '移动鼠标时发生,同eWindowMessageMouseFirst
eWindowMessageLeftButtonDown = &H201& '按下鼠标左键
eWindowMessageLeftButtonUp = &H202& '释放鼠标左键
eWindowMessageLeftButtonDoubleClick = &H203& '双击鼠标左键
eWindowMessageRightButtonDown = &H204& '按下鼠标右键
eWindowMessageRightButtonUp = &H205& '释放鼠标右键
eWindowMessageRightButtonDoubleClick = &H206& '双击鼠标右键
eWindowMessageMiddleButtonDown = &H207& '按下鼠标中键
eWindowMessageMiddleButtonUp = &H208& '释放鼠标中键
eWindowMessageMiddleButtonDoubleClick = &H209& '双击鼠标中键
eWindowMessageMouseWheel = &H20A& '当鼠标滚轮转动时发送此消息个当前有焦点的控件Buttons
End Enum
Public Enum eTextboxStyle '文本框的样式格式
eTextboxStyleLeft = &H0& '左对齐(缺省)
eTextboxStyleCenter = &H1& '居中
eTextboxStyleRight = &H2& '右对齐
eTextboxStyleMultiLine = &H4& '多行
eTextboxStyleUpperCase = &H8& '大写英文字符
eTextboxStyleLowerCase = &H10& '小写英文字符
eTextboxStylePassWord = &H20& '使用密码文本
eTextboxStyleAutoVerticalScroll = &H40& '自动垂直滚动
eTextboxStyleAutoHorizontalScroll = &H80& '自动水平滚动
eTextboxStyleNoHideSelectedText = &H100& '不要隐藏选中文本
eTextboxStyleOEMConvert = &H400& '由原始设备制造商进行转换
eTextboxStyleReadOnly = &H800& '只读(相当于被锁定)
eTextboxStyleWantReturn = &H1000& '等待回车
eTextboxStyleNumber = &H2000& '只允许数字输入
End Enum
Public Enum eWindowLong '用于SetWindowLong、GetWindowLong等函数的参数
eWindowLongWindowProcess = (-4) '窗口消息处理地址。
eWindowLongHInstance = (-6) '应用程序实例句柄。
eWindowLonghWndParent = (-8) '父窗口句柄。
eWindowLongBasicStyle = (-16) '窗口风格。
eWindowLongExtendedStyle = (-20) '扩展风格。
eWindowLongUserData = (-21) '窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。
eWindowLongID = (-12) '窗口标识符。
'当其hWnd参数指向一个对话框时,可以使用下列参数
eDialogLongMessageResult = 0 '对话框的消息结果
eDialogLongDialogProcess = 4 '对话框消息处理地址。
eDialogLongUser = 8 '对话框私有的新的额外信息,例如一个句柄或指针。类似于eWindowLongUserData。
End Enum
Public Enum eMessageBoxStyle '消息框样式
eMessageBoxStyleOkay = &H0& '确定(缺省)
eMessageBoxStyleOkayCancel = &H1& '确定、取消
eMessageBoxStyleAbortRetryIgnore = &H2& '终止、重试、忽略
eMessageBoxStyleYesNoCancel = &H3& '是、否、取消
eMessageBoxStyleYesNo = &H4& '是、否
eMessageBoxStyleRetryCancel = &H5& '重试、取消
eMessageBoxStyleCancelRetryPass = &H6& '取消、重试、跳过
eMessageBoxStyleIconHand = &H10& '手型图标(错误、停止)
eMessageBoxStyleIconQuestion = &H20& '问号图标(警告)
eMessageBoxStyleIconExclamation = &H30& '叹号图标(提示)
eMessageBoxStyleIconAsterisk = &H40& '星号图标(信息)
eMessageBoxStyleUserIcon = &H80& '用户图标
eMessageBoxStyleIconWarning = eMessageBoxStyleIconExclamation
eMessageBoxStyleIconError = eMessageBoxStyleIconHand
eMessageBoxStyleIconInformation = eMessageBoxStyleIconAsterisk
eMessageBoxStyleIconStop = eMessageBoxStyleIconHand
eMessageBoxStyleDefaultButton1 = &H0&
eMessageBoxStyleDefaultButton2 = &H100&
eMessageBoxStyleDefaultButton3 = &H200&
eMessageBoxStyleDefaultButton4 = &H300&
eMessageBoxStyleApplicationModal = &H0& '应用模型
eMessageBoxStyleSystemModal = &H1000& '系统模型
eMessageBoxStyleTaskModal = &H2000& '任务模型
eMessageBoxStyleHelp = &H4000& '帮助
eMessageBoxStyleNoFocus = &H8000& '不具备焦点
eMessageBoxStyleSetForeground = &H10000 '设置在前景
eMessageBoxStyleDefaultDesktopOnly = &H20000 '仅限于默认桌面样式(尚不明确)
eMessageBoxStyleTopMost = &H40000 '置顶
eMessageBoxStyleRight = &H80000 '右对齐(尚不明确)
eMessageBoxStyleRightToLeftReading = &H100000 '从右至左的文字顺序
eMessageBoxStyleServiceNotification = &H200000 '服务通告
eMessageBoxStyleTypeMask = &HF&
eMessageBoxStyleIconMask = &HF0&
eMessageBoxStyleDefaultMask = &HF00&
eMessageBoxStyleModeMask = &H3000&
eMessageBoxStyleMiscMask = &HC000&
End Enum
Public Enum eShowWindow '显示窗口的样式
eShowWindowHide = 0& '隐藏窗口并将活动状态传递给其它窗口。
eShowWindowNormal = 1& '激活并显示窗口。如果窗口是最小化或最大化的,则Windows恢复它原来的大小和位置。
eShowWindowMinimize = 2& '激活窗口并显示为图标。
eShowWindowMaximize = 3& '激活窗口并显示为最大化窗口。
eShowWindowShowNoActivate = 4& '显示窗口,但不激活。
eShowWindowShow = 5& '激活窗口并以其当前的大小和位置显示。
eShowWindowMinimizeNoActivate = 6& '最小化窗口并激活系统列表中的顶层窗口。
eShowWindowShowMinNoActive = 7& '将窗口显示为图标。当前活动的窗口将保持活动状态。
eShowWindowShowNoActive = 8& '按照当前状态显示窗口。当前活动的窗口将保持活动状态。
eShowWindowRestore = 9& '激活并显示窗口。如果窗口是最小化或最大化的,Windows恢复其原来的大小和位置。
eShowWindowShowDefault = 10& '激活并以默认方式显示窗口。
End Enum
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
Public Type WindowClassEx
size As Long 'WindowClassEx的大小,以字节为单位。可用LenB获得
style As eClassStyle '窗口样式,详见枚举eClassStyle
lpWindowProcess As Long '回调函数的返回值。当鼠标键盘在该窗口上操作时,该窗口收到了这个消息。此时他的lpWindowProcess指向一个回调函数,该窗口将参数送到回调函数,由回调函数执行动作
ClassExtra As Long '指定紧跟在窗口类结构后的附加字节数,即给类额外预留的空间
WindowExtra As Long '指定紧跟在窗口类结构后的附加字节数,即给窗口额外预留的空间
hInstance As Long '该窗口的句柄
hicon As Long '该窗口图标的句柄
hCursor As Long '该窗口光标的句柄
hBrushBackground As Long '背景画刷的句柄
MenuName As String '菜单名
ClassName As String '类名
hIconInTaskbar As Long '窗口在任务栏处显示的图标的句柄
End Type
Public Type PointAPI '点
X As Long
Y As Long
End Type
Public Type RectLayoutAPI '矩形框布局
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Type Msg '消息
HWnd As Long '消息所属的窗口
message As eWindowMessage '消息的标识符
wParam As Long '消息所需附加参数(标记)
lParam As Long '消息所需附加参数(内容)
time As Long '消息投递到消息队列中的时间
pt As PointAPI '鼠标的当前位置
End Type
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
'取低位
Private Function LWord(ByVal nInput As Long) As Long
LWord = nInput And &HFFFF
End Function
'取高位
Private Function HWord(ByVal nInput As Long) As Long
Dim t As Long
t = nInput And &HFFFF0000
CopyMemory HWord, t, LenB(t) / 2
End Function
'窗口事件
'按下按键
Private Sub Form_MouseDown(ByVal HWnd As Long, ByVal MouseKey As Integer, ByVal wParam As Long, ByVal lParam As Long)
Dim hDC As Long
hDC = GetDC(HWnd)
Select Case MouseKey
Case 1 '左键
Form_LeftButtonDown
Case 2 '右键
Form_RightButtonDown
End Select
ReleaseDC HWnd, hDC
End Sub
'清除打印的内容
Public Sub Form_Clear(ByVal HWnd As Long)
Dim hBr As Long, WndColor As Long, WndRect As RectLayoutAPI, hDC As Long
hDC = GetDC(HWnd) '获得hDC
hBr = GetClassLong(HWnd, eWindowClassItemHBrushBackground) '获得背景
GetClientRect HWnd, WndRect '获得窗口布局
Select Case hBr
Case 5
WndColor = &HFFF0F0F0
End Select
CreateShape hDC, WndRect.Left - 1, WndRect.Top - 1, WndRect.Right - WndRect.Left + 2, WndRect.Bottom - WndRect.Top + 2, WndColor, 0, Rectangle, FillOnly
ReleaseDC HWnd, hDC
End Sub
'窗口过程
Private Function WndProc(ByVal HWnd As Long, ByVal uMsg As eWindowMessage, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case eWindowMessageDestory
Call PostQuitMessage(0)
Case eWindowMessagePaint
'窗体绘制
Case eWindowMessageLeftButtonDown
Form_MouseDown HWnd, 1, wParam, lParam
Case eWindowMessageRightButtonDown
Form_MouseDown HWnd, 2, wParam, lParam
End Select
WndProc = DefWindowProc(HWnd, CLng(uMsg), wParam, lParam)
End Function
'获得函数的地址
'用法:调用时在参数前加上AddressOf
Public Function GetAddr(ByVal Func As Long) As Long
GetAddr = Func
End Function
'新建窗口,需要先指定或者声明一个窗口类
'参数:窗口类,窗口标题,左边距(像素,下同),上边距,宽,高,窗口基本样式,窗口拓展样式,窗口类样式,标题栏图标,窗口鼠标指针,窗口菜单句柄
'返回值:窗口句柄,失败为0
Public Function NewWindow(ByRef nWndCls As WindowClassEx, ByVal WindowTitle As String, Left As Long, Top As Long, Width As Long, Height As Long, _
Optional ByVal BasicStyle As eDrawBasicStyle = eOverLappedWindow, Optional ByVal ExtendedStyle As eDrawExtendStyle = eDefault, _
Optional ByVal ClassStyle As eClassStyle = eClassStyleResizeRedraw, _
Optional ByVal Icon As eIcon = eIconApplication, Optional ByVal Cursor As eCursor = eCursorArrow, _
Optional ByVal hMenu As Long = 0) As Long
Dim Retn As Long
With nWndCls
.size = LenB(nWndCls)
.style = ClassStyle
.ClassName = "WinForm"
.hInstance = App.hInstance
.ClassExtra = 0
.WindowExtra = 0
.hCursor = LoadCursor(0, Cursor)
.hicon = LoadIcon(0, Icon)
.lpWindowProcess = GetAddr(AddressOf WndProc)
.MenuName = 0
.hBrushBackground = sysColorWindow
End With
Call RegisterClassEx(nWndCls) '注册窗口类
Retn = CreateWindowEx(ExtendedStyle, "WinForm", WindowTitle, BasicStyle, Left, Top, Width, Height, 0, hMenu, App.hInstance, ByVal 0&)
Form_Load Retn
NewWindow = Retn
End Function
'消息循环,放在NewWindow之后
Public Sub MessageLoop(ByRef HWnd As Long)
If HWnd <> 0 Then
ShowWindow HWnd, eShowWindowNormal
Do While GetMessage(MsgInfo, 0, 0, 0)
TranslateMessage MsgInfo
DispatchMessage MsgInfo
Loop
End If
End Sub
'删除窗口对象与窗口类
Public Sub DelWindowAndClass(ByRef HWnd As Long)
DestroyWindow HWnd
UnregisterClass "WinForm", App.hInstance
End Sub
'删除窗口类
Public Sub DelClass()
UnregisterClass "WinForm", App.hInstance
End Sub
'删除窗口对象,放在MessageLoop之后
Public Sub DelWindow(ByRef HWnd As Long)
DestroyWindow HWnd
End Sub
'消息框增强
Public Function MsgBoxEx(ByRef HWnd As Long, ByVal Prompt As String, Optional ByVal style As eMessageBoxStyle = eMessageBoxStyleOkay, Optional ByVal Title As String = "")
MsgBoxEx = MessageBox(HWnd, Prompt, IIf(Title <> "", Title, App.Title), CLng(style))
End Function
复制代码
这是第二个模块的代码:
这部分代码主要是调用。实际上,只需要Sub Main里的内容就足够创建一个窗口了(然而没什么用)。
Option Explicit
Private WC As WindowClassEx, hWindow As Long
Sub Main()
Const FormWidth As Long = 600
Const FormHeight As Long = 400
hWindow = NewWindow(WC, "Form1", Screen.Width / 2 / Screen.TwipsPerPixelX - FormWidth / 2, _
Screen.Height / 2 / Screen.TwipsPerPixelY - FormHeight / 2, FormWidth, FormHeight)
MessageLoop hWindow
DelWindowAndClass hWindow
End Sub
Public Sub Form_LeftButtonDown()
Debug.Print "鼠标左键按下"
End Sub
Public Sub Form_RightButtonDown()
Debug.Print "鼠标右键按下"
End Sub
Public Sub Form_Load(ByVal HWnd As Long)
Debug.Print "窗体加载"
MsgBoxEx 0, "Hello World"
End Sub
Public Sub Form_Cls()
Debug.Print "窗体清空打印内容"
Form_Clear hWindow
End Sub
复制代码