请教高手们:在VS中,我想做如下一个功能,但是不是很清楚用什么样的方法实现最好,请高手指教:在窗口上放置32个选择框,就是VC中的check控件,用于方便输入31bit的数据。我的想法是,使用32个check控件,每个控件都要实现他的clicked事件处理函数,并且要为每个控件建立一个成员变量。但是,我觉得这样太麻烦了,因为,我可能要在窗口上放置2个32bit的数据输入功能,甚至更多个32bit的数据输入功能。这样的话,代码显得非常臃肿。请教高手,有没有更好、简洁的方法实现这个功能呢?我是新手,不要拍我,请指教!
解决方案 »
- 数据库在英文版操作系统打开出错
- 急!!!!!如何在vc的对话框中打开并显示多页的word文档?
- 求助:做个资源管理器
- VC调用office的问题,超级要我命,各位谁知道?给100分
- 这是在定义数组吗?
- 高手请进!紧急,在线等!!!!!!!!!!!!!!!!!!
- 一个老问题,在CSDN里问过不少次了,但一直未能解决。今天重提,希望各位助我一臂之力!在线等候!
- Cfile 如何写文件。以及如何替换单词?
- ScrollWindowEx的prcScroll,prcClip,hrgnUpdate都表示什么?MSDN我没看明白!那位能详细讲讲,可以加分!
- 谁能给我一个用C语言写的CGI源程序。
- freetype的问题
- 当程序处于任意状态(非活动窗口,如:最小化时)如何接收键盘消息?
1000~1031,这样在消息处理时,很容易就转换成了相应位,然后左移到相应位与以前数的相应位异或,这样每点击一个,就将相应位取反,达到了目的。
BOOL CYourDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
UINT msg = HIWORD(wParam);
if (msg == BN_CLICKED)
{
int i = LOWORD(wParam) - 1000;//得到位
m_date ^= (1 << i);//与相应位异或
}
return CDialog::OnCommand(wParam, lParam);
}
在Edit控件中控制只允许输入0和1,长度控制在32位。
感谢各位的回复~!!7楼的高手说的不错,我的意思就是就收32bit的数据,如果使用edit,设置为只允许输入0和1,这样子,没有check控件方便输入吧??
使用check还有一个好处,就是,我能在check控件上方放置标签,便于用于很方便知道操作的是哪个bit。我的说法对吗?请指教。
关于check的动态创建问题:
我懂得高手们的意思,如何创建check了,但是,要再窗口上动态放置check控件,肯定要制定check的位置了,那么,我不是很清楚如何指定check的位置信息,请高手指教一下吧?
我在网上查了,看到别用CCheckListBox实现多个check box的,我试了一下,这个方法非常简洁。但是,我有一点不太会,想请教一下:CCheckListBox实现的check box,是竖直方向的,我想让这些check box水平放置,怎么设置?
m_data ^= (1 << i);//与相应位异或
我晕,看来你没仔细看我的代码,
DWORD m_data;本身就是一个32位数,m_data ^= (1 << i);//与相应位异或
这句就是在组合呀几句代码你都不看
m_data ^= (1 << i);//与相应位异或
我晕,看来你没仔细看我的代码,
DWORD m_data;本身就是一个32位数,m_data ^= (1 << i);//与相应位异或
这句就是在组合呀几句代码你都不看
你说的这些很简单,你不用说,我就能想到,我也会做。 我的问题不是这个。
我的问题是:
使用单个的checkbox,需要在dlg上放置32个checkbox,并且要为每个建成员变量,建事件处理函数,太繁琐了。我想找一个简洁的方法实现这个功能。感谢你的指教!
事件处理,只需要在处理OnCommand一次就行了呀。再简便一点的,无非也就是用循环的方法来生成多个CHECK控件。
BOOL CYourDlg::OnInitDialog()
{
m_dwData = 0;//这个是DWORD成员变量,
char* str[] = {"性别","婚否"...};
for ( int i = 0; i < sizeof(str)/sizeof(char*); i ++)
{
CButton* pCheck = new CButton;
pCheck->Create(str[i], WS_VISIBLE|WS_CHILD|BS_CHECK, CRect(i * 10 + 50, 10, i*10 + 70, 20), this, 1000 + i);
}
}
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);
}
另外析构时需释放对象所占的内存。
CYourDlg::~CYourDlg()
{
for (int i = 0; i < 32; i ++)
{
CButton* pCheck = (CButton*)GetDlgItem(1000 + i);
delete pCheck;
}
}