是否存在接受函数返回void的ON_COMMAND_EX版本?

时间:2015-07-08 17:20:05

标签: visual-c++ command void return-type message-map

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

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

ON_COMMAND_EX会返回BOOL,因此它会强制我执行大量返回操作,如果返回类型为void,则不需要返回。

所以,正如我在第一段所述,是否有这样的宏?

2 个答案:

答案 0 :(得分:0)

您可以使用:

SELECT * FROM tb LIMIT 1;

答案 1 :(得分:0)

我没有找到这样的宏,但我提出了一个解决方案:根据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的烦人的弹出消息。

该解决方案的灵感来自于https://stackoverflow.com/a/10619963/383779

上发布的ON_MESSAGE_VOID