本笔记源自windows游戏编程大师技巧第二版3.2章,记做学习随笔。
使用vs2017环境编译。
首先接上一篇笔记创建资源的办法,来新建一个Menu文件。
再输入一个二级菜单。
打开resource.h后系统帮我们创建了两个宏定义,其中IDR_MEUN1也就是三位数的就是菜单编号,五位数的选项ID,之后会用到。
使用菜单
1.关联在window类里:
使用我们刚刚创建的菜单有三种方式:
他可以直接在创建的Windows类里,也就是WNDCLASSEX类里使用,方式如下:
WNDCLASSEX winclass; //新建窗口类
.
.
winclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); //用于加载和选用窗口
.
.
直接使用MAKEINTRESOURCE()填入宏定义即可。设置类的lpszMenuName属性,他就是用来加载菜单的。
效果如下:
2.关联在创建窗口函数里:
直接定义在菜单里有一个问题,对于这了类创建的所有窗口都会有这个菜单,所以我们也可以只设计某个窗口的菜单。
在创建窗口函数也是可以的,代码如下:
hwnd = CreateWindowEx(NULL,
"WINCLASS1", //winclass.lpszClassName设置的字符,是类的别名。
"YouWindows", //窗口的名称
WS_OVERLAPPEDWINDOW | WS_VISIBLE, //一些窗口属性
0, 0, //窗口位置
400, 400, //窗口宽高
NULL, //父窗口句柄
LoadMenu(hinstance, MAKEINTRESOURCE(IDI_ICON1)), //附属窗口句柄
hinstance, //WinMain第一个实参,程序句柄。
NULL //null就可以了
)
LoadMenu(hinstance, MAKEINTRESOURCE(IDI_ICON1)),
使用这个函数也可以做到。
3.使用SetMenu()函数关联
HMENU hunmu = LoadMenu(hinstance, MAKEINTRESOURCE(IDR_MENU1)); //定义meun的句柄。
SetMenu(hwnd, hunmu);//参数为窗口句柄和meun句柄。
这样也可以,写在创建窗口之后即可。
相应菜单事件
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
对于菜单事件消息
msg——WM_COMMAND
lparam——发出消息的窗口句柄
wparam——选择中的菜单ID
case WM_COMMAND:
{
switch (LOWORD(wparam))
{
case ID_Menu:
{
MessageBox(NULL, "窗口", "窗口", MB_OK);
}break;
default:
break;
}
}
即可。