1.菜单结构:
1.菜单显示什么 。。 字符串 ? 位图?
2.指向弹出菜单的句柄或者ID号
3.菜单的属性。带丹是否被禁用,变灰。
2.在程序中引用菜单。
3.在菜单中引用消息:
1.WM_MENUSELECT 随著使用者在功能表项中移动游标或者滑鼠,这对实作那些包含对功能表项的文字描述的状态列是很有帮助的。WM_MENUSELECT的参数如下所示:
2.WM_MENUSELECT 是一个功能表追踪讯息,wParam的值告诉您目前选择的是功能表中的哪一项(加高亮度显示的那个),wParam的高字组中的「选择旗标」可以是下列这些旗标的组合:MF_GRAYED、MF_DISABLED、MF_CHECKED、MF_BITMAP、MF_POPUP、MF_HELP、MF_SYSMENU和MF_MOUSESELECT。如果您需要根据对功能表项的选择来改变视窗显示区域的内容,那么您可以使用WM_MENUSELECT讯息。许多程式把该讯息发送给DefWindowProc。
3.WM_INITMENUPOPUP讯息:
当Windows准备显示一个突现式功能表时,它给视窗讯息处理程式发送一个WM_INITMENUPOPUP讯息,参数如下:
wParam: 突现式功能表代号
LOWORD (lParam):突现式功能表索引
HIWORD (lParam): 系统功能表为1,其他为0
4.WM_COMMAND消息
功能表 | 控制项 | ||
LOWORD (wParam): | 功能表ID | 控制项ID | |
HIWORD (wParam): | 0 | 通知码 | |
lParam: | 0 | 子视窗代号 | |
5.WM_SYSCOMMAND讯息类似於WM_COMMAND讯息,只是WM_SYSCOMMAND表示使用者从系统功能表中选择一个启用的功能表项:
wParam: 功能表ID
lParam: 0
然而,如果WM_SYSCOMMAND讯息是由按滑鼠按键产生的,LOWORD(lParam)和HIWORD(lParam)将包含滑鼠游标位置的x和y萤幕座标。
对於WM_SYSCOMMAND,功能表ID指示系统功能表中的哪一项被选中。对於预先定义的系统功能表项,较低的那四个位元应该和0xFFF0进行AND运算来遮罩掉,结果值应该为下列之一:SC_SIZE、SC_MOVE、SC_MINIMIZE、SC_MAXIMIZE、SC_NEXTWINDOW、SC_PREVWINDOW、SC_CLOSE、SC_VSCROLL、SC_HSCROLL、SC_ARRANGE、SC_RESTORE和SC_TASKLIST。此外,wParam可以是SC_MOUSEMENU或SC_KEYMENU。
如果您在系统功能表中添加功能表项,那么wParam的低字组将是您定义的功能表ID。为了避免与预先定义的功能表ID相冲突,应用程式应该使用小於0xF000的值,这对於将一般的WM_SYSCOMMAND讯息发送给DefWindowProc是很重要的。如果您不这样做,那么您实际上就是禁用了正常的系统功能表命令。
6.系统菜单:
在建立窗口后,将一个分隔符和两个菜单项添加到系统菜单中,
hSysMenu = GetSystemMenu(hwnd,FALSE) ;//的到系统菜单的句柄,并表明菜单将被修改(FLASE)。
AppendMenu(hSysMenu,MF_SEPARATOR,0,NULL) ;
AppendMenu(hSysMenu,MF_STRING,IDM_SYS_ABOUT,TEXT("The PopMenu Item")) ;
AppendMenu(hSysMenu,MF_STRING,IDM_SYS_HELP,TEXT("Help")) ;
7.弹出式菜单:
case WM_CREATE: { hMenu = GetMenu(hwnd) ; hSubMenu = GetSubMenu(hMenu,0) ; } case WM_RBUTTONUP: { point.x = LOWORD(lParam) ; point.y = HIWORD(lParam) ; ClientToScreen(hwnd,&point) ; TrackPopupMenu(hSubMenu,TPM_TOPALIGN |TPM_RIGHTBUTTON,point.x,point.y,0,hwnd,NULL) ; return 0 ; }