Visual Studio 你能传递一个参数给一个windows on_bn_clicked函数吗?

cqoc49vn  于 2023-01-31  发布在  Windows
关注(0)|答案(3)|浏览(208)

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

0ejtzxu1

0ejtzxu11#

如果按钮控件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

bt1cpqcv

bt1cpqcv2#

要扩展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] ...
  }
}
yws3nbqq

yws3nbqq3#

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

相关问题