我有一个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条答案
按热度按时间0ejtzxu11#
如果按钮控件ID的值是连续的,则可以使用
ON_CONTROL_RANGE()
宏将所有控件Map到单个处理程序,例如:现在,处理程序可以接受一个参数,告诉它是哪个控件触发了通知。
MSDN上对此进行了更详细的描述:
Handlers for Message-Map Ranges
bt1cpqcv2#
要扩展Captain Obvlious的注解:您可以使用模板方法:
yws3nbqq3#
使用
ON_COMMAND_EX
。因为这里只有一个BN_CLICKED事件,所以可以这样做: