WM_COMMAND
- WM_COMMAND命令使用范围比较广泛
- 本章主要详注WM_COMMAND的多种用途
响应菜单
HIWORD(wParam) == 0
表示按键消息LOWORD(wParam)
记录了菜单选项的ID
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
if (HIWORD(wParam) == 0) {//确定是菜单消息
switch (wmId)//匹配是哪一个菜单选项,btn也是用这个方法匹配
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case ID_OPEN_FILE:
cb_openfile(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
}
break;
响应Accelerators
WM_COMMAND
可用于响应Accelerators
设置的监控记录- 需要
LoadAccelerators
提前声明才行
/*
程序开始处
声明使用某个Accelerators表
*/
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY));
/*
捕获LoadAccelerators
HIWORD(wParam) == 1 :表示该消息时 按键消息
LOWORD(wParam) == ID_SELECTALL :表示与Accelerators中的记录ID_SELECTALL 匹配
*/
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
if (HIWORD(wParam) == 1 && LOWORD(wParam) == ID_SELECTALL) {
SendMessageA(hEditWnd, EM_SETSEL, 0,-1);
}
}
break;
响应特定window的更改操作
- 有时候我们需要相应window变动的操作
- 比如 edit属性的windows内容更改了
- 为了区别多个edit window,我们需要给每个editwindow设置独有的windoid
HIWORD(wParam) == EN_CHANGE
表示这是个window更改消息LOWORD(wParam)
获取window的id
#define ID_EDITCHILD 1234
/*
我们首先要在 window创建的时候指定windowid
*/
RECT rc;
GetClientRect(hWnd, &rc);
//创建edit窗口
hEditWnd = CreateWindowA((LPCSTR)"Edit",
NULL,
WS_CHILDWINDOW | WS_VISIBLE | WS_VSCROLL |
ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
0,
0,
rc.right - rc.left,
rc.bottom - rc.top,
hWnd,
(HMENU)ID_EDITCHILD, //这里就是设置windowid的地方
hinstance,
NULL);
/*
捕获特定窗口的 change消息
*/
case WM_COMMAND:
{
if (HIWORD(wParam) == EN_CHANGE && LOWORD(wParam) == ID_EDITCHILD){
HWND hCurEdit = (HWND)lParam;
char szBuf[256] = { 0 };
SendMessageA(hEditWnd, WM_GETTEXT, 256,
(LPARAM)szBuf);
OutputDebugStringA(szBuf);
}
}
break;