Windows零基础入门:3.5 菜单使用2-Win32菜单事件响应详细分析
手机阅读 | 转发赚积分
手机收藏 | 分享给好友
手机阅读 | 转发赚积分
手机收藏 | 分享给好友
手机收藏 | 分享给好友
上一节我们详细解释了菜单的基础知识,以及添加菜单的方法,见《Windows零基础入门:3.4 菜单使用1-Win32菜单添加详细分析》。
菜单为大量的功能和便捷操作带来了折衷。如果功能点太多,界面上必然放不下,如果功能点太少,软件不够强大。菜单就可以按照分类来容纳大量的功能,所以,是非常不错的东西哦。
而菜单始终都是用来提供功能执行的,不然也就失去了意义。那么现在我们来讲讲在Win32中如何响应菜单吧。
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_COMMAND:
{
switch (wParam)
{
case IDM_1:
MessageBox(NULL, L"菜单1点击了!", L"提示", 0);
return 0;
case ID_40003:
MessageBox(NULL, L"菜单2点击了!", L"提示", 0);
return 0;
}
}
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
从代码上可以看出,我们只处理了两个消息。一个是WM_DESTROY窗口销毁消息,一个就是菜单处理消息WM_COMMAND。在WM_COMMAND消息处理中,又使用了switch对参数进行判断,从而识别出是哪一个菜单的点击。在WM_COMMAND下识别菜单的ID,是通过wParam参数。在前面讲过,hwnd是窗口句柄,message是消息ID,wParam是附加参数,lParam是额外参数数据。很多消息只有左边两个参数,这是必不可少的。有些消息有左边三个参数,有的消息有四个参数。我们如何来确定不同的消息对应多少参数呢?你可以查阅MSDN,输入消息的ID,如WM_DESTROY,就可以查询这个消息的参数情况。通常查阅MSDN是最可靠的。
不过我有一点经验,不妨分享给大家来快速熟悉。前面两个参数都是必须的,哪个消息都跑不了。第三个就是额外的参数,比如控件的通知码、菜单的ID,说白了,就是额外传递一个唯一标识,因为WM_COMMAND实在是太泛了,底下的类别太多,需要区分,就用上每一个的唯一ID。不管是控件还是菜单还是工具栏等,每一个元素都会带有一个ID,这样就可以通过ID来区分。那么第一个参数就是窗口句柄,第二个就是WM_COMMAND消息ID,那么自然要第三个放菜单ID等了,不能空着第三个参数不用,直接放在第四个吧。
那么,如果在消息中还想传递参数的话,就要用上第四个参数。比如要设置窗口的标题文字,你就要传递一个字符串的指针过去。具体的我们在消息部分讲解。
而菜单的ID定义了数字宏,所以IDM_1其实就是一个整数而已。然后在对应的下面处理即可实现对不同菜单不同响应了。
当前文章为会员文章,请前往[用户中心]开通会员后继续阅读。
Win32课程菜单
-
- 第1节 指定入口点函数
- 第2节 VS创建Win32项目
- 第3节 exe程序文件
- 第4节 WinMain函数
- 第5节 实例句柄和命令行
- 第6节 第一个程序
- 第7节 Win32窗口机制和消息机制
- 第7节+ 消息机制补充说明(消息队列)
- 第8节 什么是窗口类
- 第9节 窗口类、进程和窗口过程
- 第10节 三种窗口类
- 第11节 修改窗口类
- 第12节 修改系统窗口类(子类化)
- 第13节 修改窗口类的机制和论证
- 第14节 窗口类使用
- 第15节 窗口类使用之窗口类结构体
- 第16节 窗口类结构体之窗口类风格
- 第17节 窗口类结构体之去除窗口类风格
- 第18节 窗口类结构体之水平重绘和垂直重绘
- 第19节 窗口类结构体之CS_DBLCLKS
- 第20节 窗口类结构体之CS_OWNDC
- 第21节 窗口类结构体之CS_CLASSDC
- 第22节 窗口类结构体之CS_PARENTDC
- 第23节 窗口类结构体之CS_NOCLOSE
- 第24节 窗口类结构体之CS_SAVEBITS
- 第25节 窗口类结构体之CS_BYTEALIGNCLIENT
- 第26节 窗口阴影效果CS_DROPSHADOW解密