我搜索但没有找到。我想要一个将菜单项命令操作链接到接受数字 ID 并且根本不提供任何返回(无效)的函数的消息映射宏。
ON_COMMAND
返回 void,但它太有限了,因为它不提供菜单项 ID,在这种情况下我需要它。
ON_COMMAND_EX
返回 a BOOL
,因此它迫使我进行大量返回,如果返回类型为 void,则不需要这样做。
那么,正如我在第一段中描述的那样,是否有这样的宏?
我搜索但没有找到。我想要一个将菜单项命令操作链接到接受数字 ID 并且根本不提供任何返回(无效)的函数的消息映射宏。
ON_COMMAND
返回 void,但它太有限了,因为它不提供菜单项 ID,在这种情况下我需要它。
ON_COMMAND_EX
返回 a BOOL
,因此它迫使我进行大量返回,如果返回类型为 void,则不需要这样做。
那么,正如我在第一段中描述的那样,是否有这样的宏?
我没有找到这样的宏,但我提供了一个解决方案:根据 的定义定义我自己的宏ON_COMMAND_EX
,替换BOOL
为void
.
ON_COMMAND_EX
宏是:
#define ON_COMMAND_EX(id, memberFxn) \
{ WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_EX, \
(AFX_PMSG) \
(static_cast< BOOL (AFX_MSG_CALL CCmdTarget::*)(UINT) > \
(memberFxn)) },
我刚刚复制并改编它以适应我自己的目的:
#define ON_COMMAND_EX_VOID(id, memberFxn) \
{ WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_EX, \
(AFX_PMSG) \
(static_cast< void (AFX_MSG_CALL CCmdTarget::*)(UINT) > \
(memberFxn)) },
请注意,仅有的两个更改是 tha 宏的名称和从更改BOOL
为void
要使用它:在消息映射上,添加类似
ON_COMMAND_EX_VOID(ID_FILE_PREFERENCES, OnFilePreferencesVoid)
然后在头文件上声明处理函数:afx_msg void OnFilePreferencesVoid(UINT nID);
最后在源代码文件上进行实现:
void CMainFrame::OnFilePreferencesVoid(UINT nID)
{
CString s;
s.Format(_T("%d"), nID);
AfxMessageBox(s);
}
显然,这里发布的代码是一个理论示例,因为除了显示带有刺激性资源 ID 的已经烦人的弹出消息之外,还有更多有用的事情要做。
该解决方案的灵感来自ON_MESSAGE_VOID
发布在https://stackoverflow.com/a/10619963/383779
您可以使用:
ON_COMMAND_RANGE(ID_COMMAND, ID_COMMAND, Handler)