0

我搜索但没有找到。我想要一个将菜单项命令操作链接到接受数字 ID 并且根本不提供任何返回(无效)的函数的消息映射宏。

ON_COMMAND返回 void,但它太有限了,因为它不提供菜单项 ID,在这种情况下我需要它。

ON_COMMAND_EX返回 a BOOL,因此它迫使我进行大量返回,如果返回类型为 void,则不需要这样做。

那么,正如我在第一段中描述的那样,是否有这样的宏?

4

2 回答 2

0

我没有找到这样的宏,但我提供了一个解决方案:根据 的定义定义我自己的宏ON_COMMAND_EX,替换BOOLvoid.

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 宏的名称和从更改BOOLvoid

要使用它:在消息映射上,添加类似

    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

于 2016-01-05T19:22:38.370 回答
0

您可以使用:

ON_COMMAND_RANGE(ID_COMMAND, ID_COMMAND, Handler)
于 2016-01-04T21:39:26.457 回答