消息映射宏除了ON_COMMAND還有其他的有擴展作用的宏,例如:
ON_COMMAND_EX、
ON_COMMAND_RANGE、
ON_COMMAND_EX_RANGE、
ON_UPDATE_COMMAND_UI_RANGE。
當希望用一個函數處理幾個相關的命令消息時,它們就很有用。
不能用ClassWizard添加上述幾個宏,需要手動添加,並且要添加在AFX_MESSAGE_MAP的括號外面。
1、ON_COMMAND_EX、ON_COMMAND_EX_RANGE的用法舉例
Assume that IDM_ZOOM_1 and IDM_ZOOM_2 are related command IDs defined in resource.h. Here's the class code you'll need to process both messages with one function, OnZoom:
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_COMMAND_EX(IDM_ZOOM_1, OnZoom)
ON_COMMAND_EX(IDM_ZOOM_2, OnZoom)
END_MESSAGE_MAP()
BOOL CMyView::OnZoom(UINT nID)
{
if (nID == IDM_ZOOM_1) {
// code specific to first zoom command
}
else {
// code specific to second zoom command
}
// code common to both commands
return TRUE; // Command goes no further
}
ON_COMMAND_EX(IDM_ZOOM_1, OnZoom)
ON_COMMAND_EX(IDM_ZOOM_2, OnZoom)
END_MESSAGE_MAP()
BOOL CMyView::OnZoom(UINT nID)
{
if (nID == IDM_ZOOM_1) {
// code specific to first zoom command
}
else {
// code specific to second zoom command
}
// code common to both commands
return TRUE; // Command goes no further
}
Here's the function prototype:
afx_msg BOOL OnZoom(UINT nID);
If the values of IDM_ZOOM_1 and IDM_ZOOM_2 were consecutive,
you could rewrite the CMyView message map as follows:
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_COMMAND_EX_RANGE(IDM_ZOOM_1, IDM_ZOOM_2, OnZoom)
END_MESSAGE_MAP()
ON_COMMAND_EX_RANGE(IDM_ZOOM_1, IDM_ZOOM_2, OnZoom)
END_MESSAGE_MAP()
Now OnZoom is called for both menu choices, and the handler can determine the choice from the integer parameter.
2、ON_COMMAND_RANGE的用法說明
ID連續的幾個命令需要同一個函數處理時,ON_COMMAND_RANGE就用到了。