是否存在接受函数返回 void 的 ON_COMMAND_EX 版本?
Does exist a ON_COMMAND_EX version accepting a function returning void?
我搜索过,但没有找到。我想要一个消息映射宏,它将菜单项命令操作链接到接受数字 ID 并且根本不提供 return(无效)的函数。
ON_COMMAND
return无效,但它太有限了,因为它没有提供我在这种情况下需要的菜单项ID。
ON_COMMAND_EX
returns 一个 BOOL
,所以它迫使我做很多 returns,如果 return 类型就不需要了无效。
所以,正如我在第一段中描述的那样,有这样一个宏吗?
您可以使用:
ON_COMMAND_RANGE(ID_COMMAND, ID_COMMAND, Handler)
我没有找到这样的宏,但我有一个解决方案:根据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)) },
请注意,只有两个变化是宏的名称和从 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
发表于
我搜索过,但没有找到。我想要一个消息映射宏,它将菜单项命令操作链接到接受数字 ID 并且根本不提供 return(无效)的函数。
ON_COMMAND
return无效,但它太有限了,因为它没有提供我在这种情况下需要的菜单项ID。
ON_COMMAND_EX
returns 一个 BOOL
,所以它迫使我做很多 returns,如果 return 类型就不需要了无效。
所以,正如我在第一段中描述的那样,有这样一个宏吗?
您可以使用:
ON_COMMAND_RANGE(ID_COMMAND, ID_COMMAND, Handler)
我没有找到这样的宏,但我有一个解决方案:根据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)) },
请注意,只有两个变化是宏的名称和从 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
发表于