ON_CONTROL_RANGE
vc ON_CONTROL_RANGE 多个控件响应一个方法2009-03-16 09:30分三个步骤 1.在头文件中声明函数例如
afx_msg void onNum(UINT uID)
2.在.cpp文件中添加函数体
void CCalculatorDlg::OnNum(UINT uID)
{ UINT index=uID-IDC_NUM_0; CString num; num.Format(_T("%d"),index); AfxMessageBox(num); } 3.添加消息映射
ON_CONTROL_RANGE(BN_CLICKED,IDC_NUM_0,IDC_NUM_9,OnNum)
第一个参数 事件
第二个参数 控件的第一个id
第三个参数 空间的最后一个id
第四个参数 响应事件的方法
注意 id号必须是连续的 如果是自己手动修改的 请先点击 build -Clear 然后在重新编译
ON_CONTROL_RANGE 宏 收藏 昨天我写一个程序,用到了多个check box,这多个check box响应了同一个函数,如果逐个添加消息映 射的话,那么太麻烦了,于是想到用下面的方法:
在.h文件中
BOOL m_fCheck[3]; // 代表3个check box选中的状态 afx_msg void OnCheck();
在.cpp中
在构造函数中: for ( int i = 0; i < 3; i++ ) m_fCheck[i] = FALSE; // 初始化3个check box都为未选中状态 在DoDataExchange中
void CTestDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP // 添加数据映射,将每个check box和对应的数组元素关联起来
for ( int i=0; i<3; i++ ) DDX_Check(pDX, IDC_CHECK1 + i, m_fCheck[i]); } 在消息映射中
BEGIN_MESSAGE_MAP(CTestDlg, CDialog) //{{AFX_MSG_MAP(CTestDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP // 添加控件响应的消息映射,由于这些控件的Id是连续的,于是我用了ON_CONTROL_RANGE
ON_CONTROL_RANGE(BN_CLICKED, IDC_CHECK1, IDC_CHECK3, OnCheck) END_MESSAGE_MAP()
在OnCheck()中
void CTestDlg::OnCheck() { } 但是问题出来了,我无论点击哪一个checkbox,在debug状态下:
随便点击任何一个,都不会出现任何问题 但在release状态下: Unhandled exception in test.exe:0xC0000005:Access Violation. 然后在输出窗口中: First-chance exception in test.exe: 0xC0000005: Access Violation. 找了一个下午都没有找出到底问题出现在什么地方,后来去了csdn,事情终于有了眉目,对于
ON_CONTROL_RANGE宏中的响应函数OnCheck必须得有一个ID的参数: afx_msg void OnCheck(UINT uID);
而无论你是否使用这个ID。实际上,经过我的测试,这个宏改为
ON_COMMAND_RANGE(IDC_CHECK1, IDC_CHECK3, OnCheck) 也可以,但是还是一样OnCheck也必须带有一个ID参数。 本文来自CSDN博客,转载请标明出处:
|
|