请教如何接受动态创建的32个checkbox的消息

specialfaint 2011-10-09 01:52:09
请教高手:
在BOOL MyDlg::OnInitDialog()函数中,添加如下代码:

m_dwData = 0;//这个是DWORD成员变量,
char * str[] = {"性别","婚否","是的"};
CString temp;
for ( int i = 0; i < sizeof(str)/sizeof(char*); i ++)
{
temp = str[i];
CButton * pCheck = new CButton;
pCheck->Create(temp, WS_VISIBLE|WS_CHILD|BS_CHECKBOX, CRect(i * 50 + 50, 10, i*50 + 70, 20), this, 1000 + i);
}

在check box创建成功之后,在用户点击任何一个check box的时候,程序接受到点击消息,并且要确认是哪个checkbox 被点击了。
请教高手们,该如何接受、解析消息?
...全文
308 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
既然接受不了别人的回复,为啥还要发帖呢?别人帮你还有错了?
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 specialfaint 的回复:]

引用 15 楼 kiven2010 的回复:
引用 14 楼 specialfaint 的回复:

引用 13 楼 specialfaint 的回复:
引用 11 楼 specialfaint 的回复:
引用 9 楼 akirya 的回复:
引用 8 楼 specialfaint 的回复:

引用 7 楼 akirya 的回复:
引用 5 楼 specialfaint 的回复:……
[/Quote]
你这种人真是人品有问题,我第一个回帖帮你顶的,然后我再回来的时候发现已经有这么多人回复了,然后我回你句你说的对,你竟然说我耍你,我真不知道该对你这种人说什么了。。。
specialfaint 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 firefly3233 的回复:]
引用 6 楼 specialfaint 的回复:
哥哥,:),你说的这个方法我试了,不行!原因是:
1) 我用的是vs2010,根本没有OnCommand这个函数。只有OnSysCommand这个函数,
2) 我用OnSysCommand这个函数试过了,接受不到消息。
3) OnSysCommand这个函数的参数和OnCommand的参数都不一样,我不知道如何获取哪个checkbox被点击……
[/Quote]

不好意思,高手!
我没有丝毫的对你发脾气的意思,叫你哥哥,纯粹是开玩笑的。
不要生气!
firefly3233 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 specialfaint 的回复:]
哥哥,:),你说的这个方法我试了,不行!原因是:
1) 我用的是vs2010,根本没有OnCommand这个函数。只有OnSysCommand这个函数,
2) 我用OnSysCommand这个函数试过了,接受不到消息。
3) OnSysCommand这个函数的参数和OnCommand的参数都不一样,我不知道如何获取哪个checkbox被点击了。
[/Quote]
VS2010难道不支持MFC,这是MFC的一个WM_COMMAND消息响应函数,好象在虚函数,需要自己添加的.
我们大部分人用得是VC6.0,VS2010确实比较难用.
找不到好好找,不行,换回VC6.0

你的脾气是有点大,你是来请教的,比你懂得多的人,很可能觉得很简单,所以说话可能有点不好听,但是为你好.你要本着请教的目的,不要这点小气都受不了.
如果动不动就发脾气,以后就没人再帮你了.
specialfaint 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 kiven2010 的回复:]
引用 14 楼 specialfaint 的回复:

引用 13 楼 specialfaint 的回复:
引用 11 楼 specialfaint 的回复:
引用 9 楼 akirya 的回复:
引用 8 楼 specialfaint 的回复:

引用 7 楼 akirya 的回复:
引用 5 楼 specialfaint 的回复:

引用 2 楼 akirya 的回复:
使……
[/Quote]


高手!!!……………………


你这句:是这样的
我不知道是好话还是坏话!!
我们在这里讨论、请教,上网查询!
最后问题解决了,你再跑过来说一句,是这样的………………
你要是早知道,怎么不早点说呢?
这是在耍我吗?


版主!
这种回帖能扣分吗?
如果能扣分我一定扣你的分!
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 specialfaint 的回复:]

引用 13 楼 specialfaint 的回复:
引用 11 楼 specialfaint 的回复:
引用 9 楼 akirya 的回复:
引用 8 楼 specialfaint 的回复:

引用 7 楼 akirya 的回复:
引用 5 楼 specialfaint 的回复:

引用 2 楼 akirya 的回复:
使用


C/C++ code
ON_COMMAN……
[/Quote]

是这样的
specialfaint 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 specialfaint 的回复:]
引用 11 楼 specialfaint 的回复:
引用 9 楼 akirya 的回复:
引用 8 楼 specialfaint 的回复:

引用 7 楼 akirya 的回复:
引用 5 楼 specialfaint 的回复:

引用 2 楼 akirya 的回复:
使用


C/C++ code
ON_COMMAND_RANGE(id1, id2, memberFxn ……
[/Quote]


并且返回的形参UINT a,其中的a,就是点击后的check box的ID………………………………………………………………………………
specialfaint 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 specialfaint 的回复:]
引用 9 楼 akirya 的回复:
引用 8 楼 specialfaint 的回复:

引用 7 楼 akirya 的回复:
引用 5 楼 specialfaint 的回复:

引用 2 楼 akirya 的回复:
使用


C/C++ code
ON_COMMAND_RANGE(id1, id2, memberFxn )



高手你说的ON_COMMAND_RA……
[/Quote]



高手:

我找到这个问题的原因和解决办法了:
ON_COMMAND_RANGE(id1, id2, memberFxn )
的memberFxn 函数,必须有形参UINT,返回值可以为void。
否则就会报错……………………
specialfaint 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 akirya 的回复:]
引用 8 楼 specialfaint 的回复:

引用 7 楼 akirya 的回复:
引用 5 楼 specialfaint 的回复:

引用 2 楼 akirya 的回复:
使用


C/C++ code
ON_COMMAND_RANGE(id1, id2, memberFxn )



高手你说的ON_COMMAND_RANGE(id1, id2, member……
[/Quote]



关于这个宏的问题:ON_COMMAND_RANGE
我baidu了一下,看到很多朋友碰到类似的问题,他们都说是应为消息处理函数的返回结果,不能是void,而应该是LRESULT。我按照同样的方法试过了,VS2010还是说,找不到这个东西………………


specialfaint 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 firefly3233 的回复:]
晕死,不是给你说了:
重载OnCommand

C/C++ code
BOOL CYourDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
UINT msg = HIWORD(wParam);
if (msg == BN_CLICKED)
{
int i = LOWORD(wParam) - 10……
[/Quote]


哦,……………………………………………………
高手…………………………………………………………


我知道了,使用你说的这个方法应该是最好的。

我可以在类向导中找到OnCommand函数,重载…………………………
感谢!………………………………
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 specialfaint 的回复:]

引用 7 楼 akirya 的回复:
引用 5 楼 specialfaint 的回复:

引用 2 楼 akirya 的回复:
使用


C/C++ code
ON_COMMAND_RANGE(id1, id2, memberFxn )



高手你说的ON_COMMAND_RANGE(id1, id2, memberFxn )
看起来好像非常好。
但是,我在vs20……
[/Quote]
那就是你用的问题了。这个宏有年头了,而且还很常用。MS不可能改这个宏,或者去掉。

pCheck->Create(temp, WS_VISIBLE|WS_CHILD|BS_CHECKBOX, CRect(i * 50 + 50, 10, i*50 + 70, 20), this, 1000 + i);
最后参数1000+i 这个就是ID,根据ID区分。
specialfaint 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 akirya 的回复:]
引用 5 楼 specialfaint 的回复:

引用 2 楼 akirya 的回复:
使用


C/C++ code
ON_COMMAND_RANGE(id1, id2, memberFxn )



高手你说的ON_COMMAND_RANGE(id1, id2, memberFxn )
看起来好像非常好。
但是,我在vs2010中使用的时候,开发环境提示,这个ON_……
[/Quote]


我知道你会发MSDN的内容出来!
我已经在MSDN上找到了这写内容。
问题就是,我的VS2010就是提示没有这个东西??请教是什么原因呢?怎么解决?
另外,即使使用这个能够让我接受到所有checkbox的命令,我用什么方法判断到底是哪个checkbox被点击了呢?
请高手指教!

不好意思,我是菜鸟,请不要生气啊!
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 specialfaint 的回复:]

引用 2 楼 akirya 的回复:
使用


C/C++ code
ON_COMMAND_RANGE(id1, id2, memberFxn )



高手你说的ON_COMMAND_RANGE(id1, id2, memberFxn )
看起来好像非常好。
但是,我在vs2010中使用的时候,开发环境提示,这个ON_COMMAND_RANGE找不到?

请教怎么处理……
[/Quote]
http://msdn.microsoft.com/en-us/library/9ab3z9tb.aspx
specialfaint 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 firefly3233 的回复:]
晕死,不是给你说了:
重载OnCommand

C/C++ code
BOOL CYourDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
UINT msg = HIWORD(wParam);
if (msg == BN_CLICKED)
{
int i = LOWORD(wParam) - 10……
[/Quote]


哥哥,:),你说的这个方法我试了,不行!原因是:
1) 我用的是vs2010,根本没有OnCommand这个函数。只有OnSysCommand这个函数,
2) 我用OnSysCommand这个函数试过了,接受不到消息。
3) OnSysCommand这个函数的参数和OnCommand的参数都不一样,我不知道如何获取哪个checkbox被点击了。

不过还是非常感谢你的指教,你说的动态创建32个checkbox的方法很好,我试过了,能创建成功。
specialfaint 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 akirya 的回复:]
使用


C/C++ code
ON_COMMAND_RANGE(id1, id2, memberFxn )
[/Quote]


高手你说的ON_COMMAND_RANGE(id1, id2, memberFxn )
看起来好像非常好。
但是,我在vs2010中使用的时候,开发环境提示,这个ON_COMMAND_RANGE找不到?

请教怎么处理?
firefly3233 2011-10-09
  • 打赏
  • 举报
回复
晕死,不是给你说了:
重载OnCommand
BOOL CYourDlg::OnCommand(WPARAM wParam, LPARAM lParam) 
{
UINT msg = HIWORD(wParam);
if (msg == BN_CLICKED)
{
int i = LOWORD(wParam) - 1000;//得到位
m_dwData ^= (1 << i);//与相应位异或
}
return CDialog::OnCommand(wParam, lParam);
}
specialfaint 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kiven2010 的回复:]
添加消息相应函数,在BEGIN_MESSAGE_MAP(CTestMfcDlg, CDialog)
//{{AFX_MSG_MAP(CTestMfcDlg)

ON_BN_CLICKED(1001, OnBtnCheck) //这句是添加的

//}}AFX_MSG_MAP
END_MESSAGE_MAP()
然后处理OnBtnCheck方法就OK了。
[/Quote]

我在一个CDialog里面,可能要产生1个32bit的数据check box,甚至要创建96个,或者更多个,如果每个都这样创建,那岂不是很麻烦?
有简洁一些的方法吗,高手?
  • 打赏
  • 举报
回复
使用

ON_COMMAND_RANGE(id1, id2, memberFxn )
  • 打赏
  • 举报
回复
添加消息相应函数,在BEGIN_MESSAGE_MAP(CTestMfcDlg, CDialog)
//{{AFX_MSG_MAP(CTestMfcDlg)

ON_BN_CLICKED(1001, OnBtnCheck) //这句是添加的

//}}AFX_MSG_MAP
END_MESSAGE_MAP()
然后处理OnBtnCheck方法就OK了。

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧