我有一个Windows GUI程序(Visual Studio 2019),其中有许多按钮可以执行相同的操作,但在不同的设备上。而不是有20个不同的宏调用,沿着以下路线:
BEGIN_MESSAGE_MAP(CChainDlg, CDialogEx)
ON_BN_CLICKED(IDC_CHECK_1, &CChainDlg::OnBnClickedCheck1)
ON_BN_CLICKED(IDC_CHECK_2, &CChainDlg::OnBnClickedCheck2)
ON_BN_CLICKED(IDC_CHECK_3, &CChainDlg::OnBnClickedCheck3)
...
END_MESSAGE_MAP()
...
void CChainDlg::OnBnClickedCheck1() {...}
void CChainDlg::OnBnClickedCheck2() {...}
void CChainDlg::OnBnClickedCheck3() {...}
...每一个都执行相同的基本算法,只是数组索引不同,我想有一个可以接受索引的调用。
ON_BN_CLICKED宏不想使用参数,因为这似乎是实现此目的最明显的方法。例如:
BEGIN_MESSAGE_MAP(CChainDlg, CDialogEx)
ON_BN_CLICKED(IDC_CHECK_1, &CChainDlg::OnBnClickedCheck(0))
ON_BN_CLICKED(IDC_CHECK_2, &CChainDlg::OnBnClickedCheck(1))
ON_BN_CLICKED(IDC_CHECK_3, &CChainDlg::OnBnClickedCheck(2))
...
END_MESSAGE_MAP()
我目前所做的是编写一个接受参数的泛型函数,并让各个OnBnClickedCheck 1()函数使用正确的参数调用泛型函数。但这看起来很混乱。
建议我一个更好的方法!
3条答案
按热度按时间r6l8ljro1#
如果按钮控件ID的值是连续的,则可以使用
ON_CONTROL_RANGE()
宏将所有控件Map到单个处理程序,例如:现在,处理程序可以接受一个参数,告诉它是哪个控件触发了通知。
这在MSDN上有更详细的描述:
Handlers for Message-Map Ranges
kpbwa7wx2#
以下是Captain Obvlious的评论:您可以使用模板方法:
f4t66c6m3#
使用
ON_COMMAND_EX
。因为这里只有一个BN_CLICKED事件,所以这将起作用: