作者:朱金灿
来源:clever101的专栏

为什么大多数人学不会人工智能编程?>>>

Win32开发消息处理的常见结构

  Win32的消息处理函数的代码结构一般如下:

//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_COMMAND:{int wmId = LOWORD(wParam);// 分析菜单选择: switch (wmId){case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}}break;case WM_PAINT:{PAINTSTRUCT ps;HDC hdc = BeginPaint(hWnd, &ps);// TODO: 在此处添加使用 hdc 的任何绘图代码...EndPaint(hWnd, &ps);}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}

  可以看出WndProc函数有两个弊端:一是不同的消息开不同的分支,非常容易导致代码膨胀;二是消息处理所需要的两个参数wParam和 lParam的类型需要针对不同的消息类型进行转化。

HANDLE_MSG宏介绍

  在windowsx.h上我找到一个宏HANDLE_MSG,发现它针对了这种情况做了有效处理,具体代码如下:

#define HANDLE_MSG(hwnd, message, fn)    \case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn))
/* BOOL Cls_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct) */
#define HANDLE_WM_CREATE(hwnd, wParam, lParam, fn) \((fn)((hwnd), (LPCREATESTRUCT)(lParam)) ? 0L : (LRESULT)-1L)

  你可以看到它是针对不同的消息进行了不同的参数转换之后再连接到具体的处理函数。以上面的代码为例,可以用HANDLE_MSG进行一番改造:

//((fn)((hwnd), (int)(LOWORD(wParam)), (HWND)(lParam), (UINT)HIWORD(wParam)), 0L)
void OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)
{switch (id){case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return;}
}/* void OnPaint(HWND hWnd) */
void OnPaint(HWND hWnd)
{PAINTSTRUCT ps;HDC hdc = BeginPaint(hWnd, &ps);// TODO: 在此处添加使用 hdc 的任何绘图代码...EndPaint(hWnd, &ps);
}void OnDestroy(HWND hWnd)
{PostQuitMessage(0);
}//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){HANDLE_MSG(hWnd, WM_COMMAND, OnCommand);HANDLE_MSG(hWnd, WM_PAINT, OnPaint);HANDLE_MSG(hWnd, WM_DESTROY, OnDestroy);default: return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}

  如果你不知道HANDLE_MSG对应的各种的消息响应函数原型如何写,可以在windowsx.h中搜索。

一个有用的Win32消息处理宏HANDLE_MSG相关推荐

  1. 静态函数一个有用的设计模式

    静态函数一个有用的设计模式 public class WardEntity : PositiveEntity { public static WardEntity GetWard(Vec3 aPos, ...

  2. 一个经典的WIN32窗口应用

    一个经典的WIN32窗口应用 源自图书<精通Windows程序设计--基于VisualC++实现> 源自图书<精通Windows程序设计–基于VisualC++实现> 这里使用 ...

  3. 动手开发一个有用的 ABAP ALV 工具 - 查看指定用户的 ABAP 传输请求试读版

    本专栏计划的文章数在 150 篇左右,到 2022年10月6日为止,目前已经更新了 56 篇,专栏完成度为 37.3% 零基础 ABAP 学习教程系列文章的目录 1. ABAP 标准培训教程 BC40 ...

  4. 一个传播 Worm.Win32.Otwycal.c / Worm.Win32.Infei.a 的网站v2

    一个传播 Worm.Win32.Otwycal.c / Worm.Win32.Infei.a 的网站 endurer 原创 2008-04-07     第2版 补充瑞星的回复             ...

  5. 一个有用的数据库:中国研究数据服务平台(CNRDS)

    一个有用的数据库:中国研究数据服务平台(CNRDS) 中国研究数据服务平台(Chinese Research Data Services,简称CNRDS)是一个高质量.开放式.平台化的中国经济.金融与 ...

  6. 一个使用纯Win32 SDK和C语言实现的五子棋游戏

    引言:GobangGame 这是一个使用纯Win32 SDK和C语言实现的五子棋游戏 在这个游戏中实现的功能 [x] 绘制一个15 * 15的棋盘 [x] 绘制5个着重点位置 [x] 根据鼠标左键的点 ...

  7. Win32 程序开发:一个简单的Win32程序

    1)什么是Win32 Win32是指Microsoft Windows操作系统的32位环境,与Win64 都为Windows常见环境.如今的Win32操作系统可以一边听音乐,一边编程,一边打印文档.W ...

  8. python 一个有用的信号控制小程序

    一个有用的信号控制小程序 这个信号控制小程序是我的一个课程作业,要求根据交叉口单点配时理论设计一个小程序,之后用python的wx库实现了可视化. wx的官方文档在这里 信号控制策略 周期时长 未饱和 ...

  9. MATLAB程序采用非支配排序遗传算法(NSGA2)求解分布式电源选址定容问题,可作为一个有用的参考,程序注释明确,算法原理可以自己搜。

    MATLAB程序采用非支配排序遗传算法(NSGA2)求解分布式电源选址定容问题,可作为一个有用的参考,程序注释明确,算法原理可以自己搜. :8620651507678049浪迹天涯

最新文章

  1. 初级程序员常犯错误一览
  2. awk内建变量示例详解之NR、FNR、NF
  3. [CSS]滤镜用法(1)
  4. python dlib学习(十):换脸
  5. 摄像头夜间拍摄画面有拖影_iQOO 3延续vivo人像拍摄基因 这些技术必须了解
  6. Java多线程-生产者与消费者
  7. python 装饰器装饰类_5分钟的Python装饰器指南
  8. mybatis配置全局变量
  9. mysql设置user权限允许远程_mysql 用户及权限管理 允许远程连接
  10. 2018/12/04 PAT刷题 L1-008 求整数段和 java
  11. Debian9开机:firmware: failed to load rtl_nic/rtl8168g-3.fw (-2)
  12. 英文博客群建如何保证收录?
  13. connection closed
  14. Android学习系列(33)--App应用之提交到各大市场渠道
  15. iis+php解析漏洞修复,IIS+PHP fastcgi模式 pathinfo取值错误任意代码执行漏洞修复方法...
  16. 帅爆! 赛博朋克特效实现
  17. Deepgreen/Greenplum删除节点步骤
  18. python自制简易二维码代码_用python把自己的二维码制作成动态码,一行代码即可搞定!敲简单!...
  19. http java编程_Java编程:发送HTTP请求到服务器
  20. PTA-- 快速排序(25)

热门文章

  1. 咬文嚼字的有趣例子_十个你可能没听过的成语,藏着十个有趣的故事
  2. 富士通南大实习五月记
  3. [编程范式]以炒菜为例,讲解各种编程范式
  4. 是什么门的缩写_开车:和她结婚需要注意什么
  5. OPPO手机备份微信数据文件到电脑本地方法教程
  6. 点星PBX(DotAsterisk)单台讯时MX100G-4E1数字中继网关同时混合接入电信、移动双运营商线路教程
  7. 关于报错django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you hav
  8. Linux基础学习总结,入门
  9. Wi-Fi DFS与TPC介绍
  10. OAuth2第三方登录快速接入