Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1614303
  • 博文数量: 441
  • 博客积分: 20087
  • 博客等级: 上将
  • 技术积分: 3562
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-19 15:35
文章分类

全部博文(441)

文章存档

2014年(1)

2012年(1)

2011年(8)

2010年(16)

2009年(15)

2008年(152)

2007年(178)

2006年(70)

分类: C/C++

2007-04-30 09:39:19

昨天我写一个程序,用到了多个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参数。
阅读(2023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~