El *_*ldo 2 c++ windows mfc visual-studio
我有一个 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() {...}
Run Code Online (Sandbox Code Playgroud)
...每个都执行相同的基本算法,仅在数组索引上有所不同,我希望有一个可以接受索引的调用。
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()
Run Code Online (Sandbox Code Playgroud)
我目前所做的是编写带有参数的通用函数,并让各个 OnBnClickedCheck1() 函数使用正确的参数调用通用函数。但这看起来很混乱。
给我建议一个更好的方法!
如果按钮控件 ID 的值是连续的,则可以使用ON_CONTROL_RANGE()宏将所有控件映射到单个处理程序,例如:
BEGIN_MESSAGE_MAP(CChainDlg, CDialogEx)
ON_CONTROL_RANGE( BN_CLICKED, IDC_CHECK_1, IDC_CHECK_3, &CChainDlg::OnBnClicked )
...
END_MESSAGE_MAP()
...
void CChainDlg::OnBnClicked(UINT nID) {...}
Run Code Online (Sandbox Code Playgroud)
现在,您的处理程序可以采用一个参数来告诉它哪个控件触发了通知。
MSDN 上对此有更详细的描述:
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |