C开发Windows--菜单和快捷键
作 者: xcode网 站: http://edu.
1。 菜单中的每一项都有三个特性:
1)菜单的显示特性,可以是位图,可以是字符串
2)WM_COMMAND消息中windows发送给程序的菜单id
3)菜单的属性,包括是否被禁用,灰化或被选中。
2。菜单的定义
1)使用菜单编辑器。
2)通过编程来实现。
CreateMenu, CreatePopupMenu
3。在程序中引用菜单
1)在WNDCLASSEX 结构项里面wndclass.lpszMenuName = szMenuName;
2) 使用LoadMenu将菜单加载到内存,然后在CreateWindowEx中,将这个菜单句柄作为CreateWindowEx的一个参数。例如:
HMENU hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(ID_MENU));
HWND hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,"myclass","window caption",
WS_OVERLAPPEDWINDOW,100,100,600,400,NULL,
hMenu,hInstance,NULL);
3). 在窗口类中指定为NULL,在CreateWindowEx中也指定菜单项参数为空,在窗口创建后使用SetMenu(hWnd,hMenu);的方式给窗口设置菜单。 这种方式可以动态的修改窗口菜单。
4。菜单和消息
当用户选择一个菜单项时,windwos通常向窗口过程发送几个不同的消息。在大多数情况下,你的程序可以忽略大部分的消息,只需要把他们传递给DefWindowProc即可。
1)WM_INITMENU 消息,wParam :主菜单句柄, lParam : 0
这个消息是当一个菜单将要激活时发出。当用户点击菜单栏上的项或者使用菜单键选择。这个消息允许应用程序在显示之前修改菜单。可以在这时修改顶层菜单。
2)WM_MENUSELECT: LOWORD(wParam): 选中项:菜单id或者弹出式菜单句柄。
HIWORD(wParam): 选择标志
lParam: 包含选中项的菜单句柄。
当用户选择某个菜单项时,这个消息就会被发送到菜单所属的窗口。
这个消息是一个菜单跟踪消息,wParam告诉你当前选中的是菜单中的哪一项,wParam的高位字中的“选择标志”可以是下列这些标志的组合:MF_GRAYED、MF_DISABLED、MF_CHECKED、MF_BITMAP、MF_POPUP、MF_HELP、MF_SYSMENU和MF_MOUSESELECT.
如果你需要根据菜单项的选择来改变窗口客户区的内容,那么可以你可以使用这个消息。
3)WM_INITMENUPOPUP: wParam: 弹出式菜单句柄
LOWORD(lParam):弹出式菜单索引
HIWORD(lParam):系统菜单为1,其他为0
如果要在弹出式菜单显示之前启用或者禁用菜单项,那么这个消息就很重要。
4)WM_COMMAND: LOWORD(wParam): 菜单id
HIWOED(wParam): 0
lParam: 0
如果这个消息是由子窗口控制产生,如button产生则:
LOWORD(wParam): 控制ID
HIWORD(lParam): 通知码
lParam: 子窗口句柄。
如果这个消息是由子窗口或者快捷键产生,则通知码为1,由菜单产生,通知码为0。
通过参数,可以区分这个消息的来源是来自于控件,快捷键还是菜单。
5)WM_SYSCOMMAND: 类似于WM_COMMAND消息,只是WM_SYSCOMMAND表示用户从系统菜单中选择一个启动菜单项或者用户选择最大化,最小化,关闭按钮。
LOWORD(wParam): 菜单id
HIWOED(wParam): 0
lParam: 0
如果消息是由按鼠标产生的,LOWORD(wParam)和HIWORD(lParam)将包含鼠标光标的位置x,y屏幕坐标。
对于windows预先定义的系统菜单项,用wParam表示。
SC_CLOSE,SC_MAXIMIZE,SC_MINIMIZE,SC_MOVE等等。
5。更改菜单:
AppendMenu, DeleteMenu,InsertMenu,ModifyMenu,RemoveMenu等等。
6。键盘加速键
1) 定义
A)资源编辑器
B)编程实现:CreateAcceleratorTable
2)加载
LoadAccelerators
3)转换
TranslateAccelerator 把键盘讯息转换为WM_COMMAND或WM_SYSCOMMAND讯息。
4)消息处理
相关网站:http://edu.