2.04 创建消息

学习思路: 消息产生时间, 消息附带 2 个信息以及一般用法

WM_DESTROY

  • 产生时间:窗口被销毁时
  • 附带信息:wParam 与 lParam 均为 0
  • 一般用法: 销毁前做善后, 资源/内存等

WM_SYSCOMMAND

产生时间: 点击最大化/最小化/关闭时

附带信息

  • wParam: 具体点击位置,例如关闭 SC_CLOSE 等
  • lParam: 鼠标光标位置(共 4 字节的 long 类型)
    • LOWORD(lParam) // 水平位置(低 2 字节)
    • HIWORD(lParam) // 垂直位置(高 2 字节)

一般用法: 用在窗口关闭时, 提示用户处理(是否关闭等)

  1. case WM_SYSCOMMAND:
  2. if (wParam == SC_CLOSE)
  3. {
  4. int nRet = MessageBox(hWnd, "是否关闭窗口", "提示关闭窗口", MB_YESNO);
  5. if (nRet == IDYES) {
  6. // 什么都不写 自动跳过
  7. }
  8. else {
  9. return 0;
  10. }
  11. }
  12. break;

WM_CREATE

产生时间: 窗口创建成功但还未显示时

附带信息:

  • wParam: 为 0
  • lParam: 为 CREATESTRUCT 类型的指针 (通过该指针可以获取 CreateWindowEx 中的全部 12 个参数的信息) 需要强转为CREATESTRUCT
  • 一般用法: 初始化窗口参数/资源等, 包括创建子窗口
  1. void OnCreate(HWND hWnd, LPARAM lParam) {
  2. CREATESTRUCT* pcs = (CREATESTRUCT*)lParam;
  3. char* pszText = (char*)pcs->lpszName; // window, 获取的内容也要强转
  4. MessageBox(hWnd, "窗口", pszText, MB_YESNO);
  5. }
  6. case WM_CREATE:
  7. OnCreate(hWnd, lParam);
  8. break;

WM_SIZE

产生时间: 在窗口大小发生变化后(初始化时也会调用一次) 拖拽/最大化/最小化

附带信息:

  • wParam: 窗户大小变化的原因
  • lParam: 窗口变化后的大小
    • LOWORD(lParam) // 变化后的宽度
    • HIWORD(lParam) // 变化后的高度

一般用法: 窗口变化后, 调整窗口各个部分的布局

WM_QUIT

产生时间: 程序员发送

附带信息

  • wParam: PostQuitMessage 函数传递的参数
  • lParam: 0

一般用法: 用于结束消息循环, 当 GetMessage 接受到这个消息后, 会返回 FALSE, 从而结束 while,退出循环