您可以将参数传递给 Windows ON_BN_CLICKED 宏吗?

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() 函数使用正确的参数调用通用函数。但这看起来很混乱。

给我建议一个更好的方法!

Rem*_*eau 5

如果按钮控件 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 上对此有更详细的描述:

消息映射范围的处理程序