Visual Studio 你能传递一个参数给windows的ON_BN_CLICKED宏吗?

kxe2p93d  于 2023-06-06  发布在  Windows
关注(0)|答案(3)|浏览(154)

我有一个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()函数使用正确的参数调用泛型函数。但这看起来很混乱。
建议我一个更好的方法!

r6l8ljro

r6l8ljro1#

如果按钮控件ID的值是连续的,则可以使用ON_CONTROL_RANGE()宏将所有控件Map到单个处理程序,例如:

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) {...}

现在,处理程序可以接受一个参数,告诉它是哪个控件触发了通知。
这在MSDN上有更详细的描述:
Handlers for Message-Map Ranges

kpbwa7wx

kpbwa7wx2#

以下是Captain Obvlious的评论:您可以使用模板方法:

class CChainDlg {
  BEGIN_MESSAGE_MAP(CChainDlg, CDialogEx)
    ON_BN_CLICKED   ( IDC_CHECK_1,  &CChainDlg::OnBnClickedCheck<1> )
    ON_BN_CLICKED   ( IDC_CHECK_2,  &CChainDlg::OnBnClickedCheck<2> )
    ON_BN_CLICKED   ( IDC_CHECK_3,  &CChainDlg::OnBnClickedCheck<3> )
    ...
  END_MESSAGE_MAP()

  template<size_t idx>
  void OnBnClickedCheck() {
    ... my_array[idx] ...
  }
}
f4t66c6m

f4t66c6m3#

使用ON_COMMAND_EX。因为这里只有一个BN_CLICKED事件,所以这将起作用:

BEGIN_MESSAGE_MAP(CChainDlg, CDialogEx)
    ON_COMMAND_EX( IDC_CHECK_1, &CChainDlg::OnBnClicked ) 
    ON_COMMAND_EX( IDC_CHECK_2, &CChainDlg::OnBnClicked ) 
    ...
END_MESSAGE_MAP()
...
BOOL CChainDlg::OnBnClicked(UINT nID) {...}

相关问题