如何在旧版 MFC 代码的事件处理程序中添加回调?

How to add a callback in an event handler in a legacy MFC code?

提问人:ark1974 提问时间:6/14/2022 最后编辑:ark1974 更新时间:6/25/2022 访问量:182

问:

这是使用 MFC 的旧代码的玩具实现。 是一个事件处理程序,但它包含在不同的线程中异步执行的代码(可能是一个坏主意)。声明语法被消息映射接受。OnBnClickedButton

//declaration
afx_msg void OnBnClickedButton(); 
//message map
ON_BN_CLICKED(IDC_BUTTON, &CMFCApplicationDlg::OnBnClickedButton)

现在我想像这样向事件处理程序添加回调,但是消息映射不接受新的声明语法,该去哪里?

afx_msg void OnBnClickedButton(std::optional<std::function<CString(void)>> callback); 
C++ 多线程 回调 MFC

评论

4赞 Remy Lebeau 6/14/2022
您无法向已建立的事件添加新参数。MFC 按钮处理程序不接受任何参数。

答:

4赞 IInspectable 6/14/2022 #1

MFC 消息映射中条目的函数签名和返回值是固定的。您必须遵守协议;它不提供任何自定义点。对于按钮处理程序,原型必须遵守以下签名ON_BN_CLICKED

afx_msg void memberFxn();

它不接受或返回任何值。唯一可用的状态是消息映射条目(即 每当单击 with ID 表示的对话框的子控件时,都会调用。OnBnClickedButtonCMFCApplicationDlgIDC_BUTTON

在你的实现中,你可以自由地做任何你喜欢的事情,比如查询其他信息(例如,从类实例或线程本地存储中存储的数据中),显式或使用C++20协程启动线程,等等。OnBnClickedButton

MFC 不会为您提供任何帮助,特别是它不为异步操作提供任何类型的支持。这是您必须自己实现的事情。