前言
前面我们学习了win32消息机制,我们都知道一个软件的展开,出现在我们面前的就是一个界面,而我们在选择操作的时候,就会有很多的选项,这个就叫做菜单。菜单的设置以及库的应用,对我们开发软件会有很多的帮助。
一、菜单
分类
从编程的角度来说,可以分以下几类:
①.静态菜单:在菜单资源编译器中提前编译好。
②.动态菜单:在程序运行的过程中通过代码实现。
③.快捷菜单:是前两种菜单的组合,在菜单资源编辑器中预先编辑好,然后在程序运行过程中动态的显示。
对于菜单而言,可以理解为一个二维数组。
例如:
vs编译器,最上层的就是菜单。
菜单项
菜单里面的每一个元素都是一个菜单项。
菜单项包含两个最基本的要素:1.菜单项名字
2.菜单项唯一标识ID;
每一个菜单还可以是嵌套的子菜单数组;
菜单初始化
这里是新创建的菜单,然后自己创建了静态菜单。
菜单加载
菜单类中加载菜单
wndWindowsProject2pszMenuName=MAKEINTRESOURCE(IDR_MENU1);
在注册窗口中,找到图中的代码,只需要在这里改变参数,也就是将菜单的标识ID输入进去,就可以完成窗口的加载,除了这里,还有一个地方就是:
这两处只需要一处填写就可以了.
创建窗口时加载
HMENU hmenu=LoadMenu(Hinstance,MAKEINTRESOURCE(INR_MENU1)); HWND hWnd = CreateWindowW(szWindowClass, //窗口类名,注意,必须是已经注册的窗口类名; szTitle, //窗口标题名; WS_OVERLAPPEDWINDOW| WS_VSCROLL, // 窗口风格; CW_USEDEFAULT, //窗口的坐标x 0, // 窗口的y坐标 CW_USEDEFAULT, //窗口的宽度 0, //窗口的高度 nullptr, //父窗口菜单句柄 hMenu, // 窗口菜单句柄,这里可以加载窗口; hInstance, //当前实例句柄 nullptr); // 保留参数;
动态加载
// 动态加载 //1.创建一个新菜单 HMENU hmenu = nullptr; hmenu = CreateMenu(); //2.向菜单中添加选项; AppendMenu(hmenu,/*在哪一个菜单中添加;*/ MF_POPUP, 1086, _T("新建(&N)")); AppendMenu(hmenu,/*在哪一个菜单中添加;*/ MF_POPUP, 1087, _T("打开(&O)")); HMENU hmenu3 = CreateMenu(); AppendMenu(hmenu3, MF_POPUP, 1088, _T("转到(&G)")); AppendMenu(hmenu3, MF_POPUP, 1089, _T("替换(&F)")); HMENU hmenu2 = CreateMenu(); AppendMenu(hmenu2, MF_POPUP, (UINT)hmenu, _T("文件(&F)")); AppendMenu(hmenu2, MF_POPUP, (UINT)hmenu3, _T("编辑(&E)"));
菜单响应
如果要达到菜单响应,就在WM_COMMEND消息中响应;
case 1086: MessageBox(hWnd, _T("快捷键Ctrl+N,新建文件"), _T("提示"), 0); break; case 1087: MessageBox(hWnd, _T("快捷键Ctrl+O,打开文件"), _T("提示"), 0); break; case 1088: MessageBox(hWnd, _T("快捷键Ctrl+E,转到文件"), _T("提示"), 0); break; case 1089: MessageBox(hWnd, _T("快捷键Ctrl+F,查找文件"), _T("提示"), 0); break;
这是利用快捷键所操作的。
右键菜单(快捷菜单)
我们在使用一个软件的时候会发现点击鼠标右键会出现一列菜单,而这个菜单是已经编辑好的,但是是动态显示的,在我们需要的时候就直接点击鼠标右键。而这种菜单也叫做快捷菜单。
1.在资源编辑器中编辑好新的右键菜单。
2.初始化加载,可以在WM_CREATEMENU内或者在主消息循环之前加载。
g_hRMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1))
3.在WM_RBUTTONDOWN内可以响应
POINT pt; pt.x=LOWORD(LParam); pt.y=LOWORD(LParam); //把客户区坐标转为屏幕坐标; ClientToScreen(hWnd,&pt); //也可以直接使用GetCurSorPos(&pt);来获取鼠标的坐标; HMENU tempMenu=GetSubMenu(g_hRMenu,1); //把g_hRMenu里面的0列表示的菜单绘制到tempMenu; //弹出右键菜单 TrackPopupMenu(tempMenu, TpM_LEFTALIGN, pt.x, pt.y, 0, hWnd, nullptr);
当我们点击鼠标右键的时候就会出现如图的结构;