VB打造超酷个性化菜单(三)

VB 打造超酷个性化菜单(三)

现在到了最关键,最精彩,也是最复杂的部分了。我们最关心的就是怎样“画”菜单,怎样处理菜单事件,在 MenuWndProc 这个处理消息的函数里,我们要处理如下消息: WM_COMMAND (单击菜单项), WM_MEASUREITEM (处理菜单高度和宽度), WM_MENUSELECT (选择菜单项), WM_DRAWITEM (绘制菜单项)。

打开上次建好的工程,添加一个标准模块,并将其名称设置为 mMenu ,代码如下:

'**************************************************************************************************************

'* 本模块配合 cMenu 菜单类模块

'*

'* 版权 : LPP 软件工作室

'* 作者 : 卢培培 (goodname008)

'* (******* 复制请保留以上信息 *******)

'**************************************************************************************************************

Option Explicit

' -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- API 函数声明 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

Public Declare Function CallWindowProc 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

Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long

Public Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long

Public Declare Function CreatePopupMenu Lib "user32" () As Long

Public Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long

Public Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

Public Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long

Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Public Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long

Public Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Long

Public Declare Function DrawIconEx Lib "user32" (ByVal hdc As Long, ByVal xLeft As Long, ByVal yTop As Long, ByVal hIcon As Long, ByVal cxWidth As Long, ByVal cyWidth As Long, ByVal istepIfAniCur As Long, ByVal hbrFlickerFreeDraw As Long, ByVal diFlags As Long) As Long

Public Declare Function DrawState Lib "user32" Alias "DrawStateA" (ByVal hdc As Long, ByVal hBrush As Long, ByVal lpDrawStateProc As Long, ByVal lParam As Long, ByVal wParam As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal n3 As Long, ByVal n4 As Long, ByVal un As Long) As Long

Public Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long

Public Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long

Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Public Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long

Public Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

Public Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As Long, lpMenuItemInfo As MENUITEMINFO) As Long

Public Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long

Public Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

Public Declare Function InflateRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long

Public Declare Function InsertMenuItem Lib "user32" Alias "InsertMenuItemA" (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, ByRef lpcMenuItemInfo As MENUITEMINFO) As Long

Public Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long

Public Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As Long) As Long

Public Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long

Public Declare Function SetMenuItemInfo Lib "user32" Alias "SetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, lpcMenuItemInfo As MENUITEMINFO) As Long

Public Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

' -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- API 常量声明 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Public Const GWL_WNDPROC = (-4) ' SetWindowLong 设置窗口函数入口地址

Public Const SM_CYMENU = 15 ' GetSystemMetrics 获得系统菜单项高度

Public Const WM_COMMAND = &H111 ' 消息 : 单击菜单项

Public Const WM_DRAWITEM = &H2B ' 消息 : 绘制菜单项

Public Const WM_EXITMENULOOP = &H212 ' 消息 : 退出菜单消息循环

Public Const WM_MEASUREITEM = &H 2C ' 消息 : 处理菜单高度和宽度

Public Const WM_MENUSELECT = &H 11F ' 消息 : 选择菜单项

' ODT

Public Const ODT_MENU = 1 ' 菜单

Public Const ODT_LISTBOX = 2 ' 列表框

Public Const ODT_COMBOBOX = 3 ' 组合框

Public Const ODT_BUTTON = 4 ' 按钮

' ODS

Public Const ODS_SELECTED = &H1 ' 菜单被选择

Public Const ODS_GRAYED = &H2 ' 灰色字

Public Const ODS_DISABLED = &H4 ' 禁用

Public Const ODS_CHECKED = &H8 ' 选中

Public Const ODS_FOCUS = &H10 ' 聚焦

' diFlags to DrawIconEx

Public Const DI_MASK = &H1 ' 绘图时使用图标的 MASK 部分 ( 如单独使用 , 可获得图标的掩模 )

Public Const DI_IMAGE = &H2 ' 绘图时使用图标的 XOR 部分 ( 即图标没有透明区域 )

Public Const DI_NORMAL = DI_MASK Or DI_IMAGE ' 用常规方式绘图 ( 合并 DI_IMAGE 和 DI_MASK)

' nBkMode to SetBkMode

Public Const TRANSPARENT = 1 ' 透明处理 , 即不作上述填充

Public Const OPAQUE = 2 ' 用当前的背景色填充虚线画笔、阴影刷子以及字符的空隙

Public Const NEWTRANSPARENT = 3 ' 在有颜色的菜单上画透明文字

' MF 菜单相关常数

Public Const MF_BYCOMMAND = &H0& ' 菜单条目由菜单的命令 ID 指定

Public Const MF_BYPOSITION = &H400& ' 菜单条目由条目在菜单中的位置决定 ( 零代表菜单中的第一个条目 )

Public Const MF_CHECKED = &H8& ' 检查指定的菜单条目 ( 不能与 VB 的 Checked 属性兼容 )

Public Const MF_DISABLED = &H2& ' 禁止指定的菜单条目 ( 不与 VB 的 Enabled 属性兼容 )

Public Const MF_ENABLED = &H0& ' 允许指定的菜单条目 ( 不与 VB 的 Enabled 属性兼容 )

Public Const MF_GRAYED = &H1& ' 禁止指定的菜单条目 , 并用浅灰色描述它 . ( 不与 VB 的 Enabled 属性兼容 )

Public Const MF_HILITE = &H80&

Public Const MF_SEPARATOR = &H800& ' 在指定的条目处显示一条分隔线

Public Const MF_STRING = &H0& ' 在指定的条目处放置一个字串 ( 不与 VB 的 Caption 属性兼容 )

Public Const MF_UNCHECKED = &H0& ' 检查指定的条目 ( 不能与 VB 的 Checked 属性兼容 )

Public Const MF_UNHILITE = &H0&

Public Const MF_BITMAP = &H4& ' 菜单条目是一幅位图 . 一旦设入菜单 , 这幅位图就绝对不能删除 , 所以不应该使用由 VB 的 Image 属性返回的值 .

Public Const MF_OWNERDRAW = &H100& ' 创建一个物主绘图菜单 ( 由您设计的程序负责描绘每个菜单条目 )

Public Const MF_USECHECKBITMAPS = &H200&

Public Const MF_MENUBARBREAK = &H20& ' 在弹出式菜单中 , 将指定的条目放置于一个新列 , 并用一条垂直线分隔不同的列 .

Public Const MF_MENUBREAK = &H40& ' 在弹出式菜单中 , 将指定的条目放置于一个新列 . 在顶级菜单中 , 将条目放置到一个新行 .

Public Const MF_POPUP = &H10& ' 将一个弹出式菜单置于指定的条目 , 可用于创建子菜单及弹出式菜单 .

Public Const MF_HELP = &H4000&

Public Const MF_DEFAULT = &H1000

Public Const MF_RIGHTJUSTIFY = &H4000

' fMask To InsertMenuItem ' 指定 MENUITEMINFO 中哪些成员有效

Public Const MIIM_STATE = &H1

Public Const MIIM_ID = &H2

Public Const MIIM_SUBMENU = &H4

Public Const MIIM_CHECKMARKS = &H8

Public Const MIIM_TYPE = &H10

Public Const MIIM_DATA = &H20

Public Const MIIM_STRING = &H40

Public Const MIIM_BITMAP = &H80

Public Const MIIM_FTYPE = &H100

' fType To InsertMenuItem ' MENUITEMINFO 中菜单项类型

Public Const MFT_BITMAP = &H4&

Public Const MFT_MENUBARBREAK = &H20&

Public Const MFT_MENUBREAK = &H40&

Public Const MFT_OWNERDRAW = &H100&

Public Const MFT_SEPARATOR = &H800&

Public Const MFT_STRING = &H0&

' fState to InsertMenuItem ' MENUITEMINFO 中菜单项状态

Public Const MFS_CHECKED = &H8&

Public Const MFS_DISABLED = &H2&

Public Const MFS_ENABLED = &H0&

Public Const MFS_GRAYED = &H1&

Public Const MFS_HILITE = &H80&

Public Const MFS_UNCHECKED = &H0&

Public Const MFS_UNHILITE = &H0&

' nFormat to DrawText

Public Const DT_LEFT = &H0 ' 水平左对齐

Public Const DT_CENTER = &H1 ' 水平居中对齐

Public Const DT_RIGHT = &H2 ' 水平右对齐

Public Const DT_SINGLELINE = &H20 ' 单行

Public Const DT_TOP = &H0 ' 垂直上对齐 ( 仅单行时有效 )

Public Const DT_VCENTER = &H4 ' 垂直居中对齐 ( 仅单行时有效 )

Public Const DT_BOTTOM = &H8 ' 垂直下对齐 ( 仅单行时有效 )

Public Const DT_CALCRECT = &H400 ' 多行绘图时矩形的底边根据需要进行延展 , 以便容下所有文字 ; 单行绘图时 , 延展矩形的右侧 , 不描绘文字 , 由 lpRect 参数指定的矩形会载入计算出来的值 .

Public Const DT_WORDBREAK = &H10 ' 进行自动换行 . 如用 SetTextAlign 函数设置了 TA_UPDATECP 标志 , 这里的设置则无效 .

Public Const DT_NOCLIP = &H100 ' 描绘文字时不剪切到指定的矩形

Public Const DT_NOPREFIX = &H800 ' 通常 , 函数认为 & 字符表示应为下一个字符加上下划线 , 该标志禁止这种行为 .

Public Const DT_EXPANDTABS = &H40 ' 描绘文字的时候 , 对制表站进行扩展 . 默认的制表站间距是 8 个字符 . 但是 , 可用 DT_TABSTOP 标志改变这项设定 .

Public Const DT_TABSTOP = &H80 ' 指定新的制表站间距 , 采用这个整数的高 8 位 .

Public Const DT_EXTERNALLEADING = &H200 ' 计算文本行高度的时候 , 使用当前字体的外部间距属性 .

' nIndex to GetSysColor 标准 : 0--20

Public Const COLOR_ACTIVEBORDER = 10 ' 活动窗口的边框

Public Const COLOR_ACTIVECAPTION = 2 ' 活动窗口的标题

Public Const COLOR_APPWORKSPACE = 12 ' MDI 桌面的背景

Public Const COLOR_BACKGROUND = 1 ' Windows 桌面

Public Const COLOR_BTNFACE = 15 ' 按钮

Public Const COLOR_BTNHIGHLIGHT = 20 ' 按钮的 3D 加亮区

Public Const COLOR_BTNSHADOW = 16 ' 按钮的 3D 阴影

Public Const COLOR_BTNTEXT = 18 ' 按钮文字

Public Const COLOR_CAPTIONTEXT = 9 ' 窗口标题中的文字

Public Const COLOR_GRAYTEXT = 17 ' 灰色文字 ; 如使用了抖动技术则为零

Public Const COLOR_HIGHLIGHT = 13 ' 选定的项目背景

Public Const COLOR_HIGHLIGHTTEXT = 14 ' 选定的项目文字

Public Const COLOR_INACTIVEBORDER = 11 ' 不活动窗口的边框

Public Const COLOR_INACTIVECAPTION = 3 ' 不活动窗口的标题

Public Const COLOR_INACTIVECAPTIONTEXT = 19 ' 不活动窗口的文字

Public Const COLOR_MENU = 4 ' 菜单

Public Const COLOR_MENUTEXT = 7 ' 菜单文字

Public Const COLOR_SCROLLBAR = 0 ' 滚动条

Public Const COLOR_WINDOW = 5 ' 窗口背景

<span lang="EN" style="FONT-FAMILY

Published At
Categories with Web编程
Tagged with
comments powered by Disqus