是否存在接受函数返回 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 发表于