声明和定义
先来看看 OnCommand 的声明和定义
//声明
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
//定义
BOOL CDlgTest::OnCommand(WPARAM wParam, LPARAM lParam)
{
return CDialog::OnCommand(wParam, lParam);
}
参数
重点是在参数所传递的内容上面,下面摘抄自 MSDN 的一段解释:
/*
wParam
The low-order word of wParam identifies the command ID of the menu item, control, or accelerator.
The high-order word of wParam specifies the notification message if the message is from a control.
If the message is from an accelerator, the high-order word is 1. If the message is from a menu,
the high-order word is 0.
lParam
Identifies the control that sends the message if the message is from a control. Otherwise, lParam is 0.
Return Value
An application returns nonzero if it processes this message; otherwise 0.
*/
大致意识就是指:wParam 的低位表示菜单项、控件、或者快捷键的 ID 值,如果表示的是控件的话,高位值代表相应的通知消息值,如果地位表示快捷键的话,高位值为 1,如果低位值是菜单的话,高位值就为 0 。
lParam
如果 WM_COMMAND 来自控件的话 lParam 就是发送这个 WM_COMMAND 消息的控件的句柄,否则为 0 。
使用
既然知道 wParam 的低位表示菜单项、控件、或者快捷键的 ID 值,那么我们在响应按钮点击时,可以不用逐个编写按钮消息映射及消息响应函数,而直接在 onCommand 内处理:
BOOL CDlgTest::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch(LOWORD(wParam))//wParam的低字是控件ID,lParam是发送这个WM_COMMAND消息的控件的句柄。
{
case IDC_BTN_BEGIN:
{
AfxMessageBox(_T("开始"));
break;
}
case IDC_BTN_END:
{
AfxMessageBox(_T("结束"));
break;
}
}
return CDialog::OnCommand(wParam, lParam);
}