请教高手们:在VS中,我想做如下一个功能,但是不是很清楚用什么样的方法实现最好,请高手指教:在窗口上放置32个选择框,就是VC中的check控件,用于方便输入31bit的数据。我的想法是,使用32个check控件,每个控件都要实现他的clicked事件处理函数,并且要为每个控件建立一个成员变量。但是,我觉得这样太麻烦了,因为,我可能要在窗口上放置2个32bit的数据输入功能,甚至更多个32bit的数据输入功能。这样的话,代码显得非常臃肿。请教高手,有没有更好、简洁的方法实现这个功能呢?我是新手,不要拍我,请指教!

解决方案 »

  1.   

    新建一个32长度的数组,类型为Check*,然后循环创建32个Check,ID范围控制好,全部显示出来。添加一个消息响应ON_CONTROL_RANGE(BN_CLICKED, ID_FIRST, ID_LAST, OnClick),写一个响应函数OnClick,在里边可以获得是点击了ID为多少的Check,做响应处理就可以了
      

  2.   

    补充:Check貌似是用CButton类,风格里边选择Check
      

  3.   

    你的32个CHECK控件ID,你将他们改成连续的,如:
    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);
    }
      

  4.   

    不就是要接收32位二进制数吗?使用一个CEdit控件就行了,为什么要用32个Check?
    在Edit控件中控制只允许输入0和1,长度控制在32位。
      

  5.   

    各位高手:
    感谢各位的回复~!!7楼的高手说的不错,我的意思就是就收32bit的数据,如果使用edit,设置为只允许输入0和1,这样子,没有check控件方便输入吧??
    使用check还有一个好处,就是,我能在check控件上方放置标签,便于用于很方便知道操作的是哪个bit。我的说法对吗?请指教。
    关于check的动态创建问题:
    我懂得高手们的意思,如何创建check了,但是,要再窗口上动态放置check控件,肯定要制定check的位置了,那么,我不是很清楚如何指定check的位置信息,请高手指教一下吧?
      

  6.   

    6楼的朋友,你的做法好像非常好。但是,我有点不是太明白如何将32个check连接成数组,能说详细一点吗?
      

  7.   

    请教高手:
    我在网上查了,看到别用CCheckListBox实现多个check box的,我试了一下,这个方法非常简洁。但是,我有一点不太会,想请教一下:CCheckListBox实现的check box,是竖直方向的,我想让这些check box水平放置,怎么设置?
      

  8.   

           int i = LOWORD(wParam) - 1000;//得到位
            m_data ^= (1 << i);//与相应位异或
    我晕,看来你没仔细看我的代码,
    DWORD m_data;本身就是一个32位数,m_data ^= (1 << i);//与相应位异或
    这句就是在组合呀几句代码你都不看
      

  9.   

           int i = LOWORD(wParam) - 1000;//得到位
            m_data ^= (1 << i);//与相应位异或
    我晕,看来你没仔细看我的代码,
    DWORD m_data;本身就是一个32位数,m_data ^= (1 << i);//与相应位异或
    这句就是在组合呀几句代码你都不看
      

  10.   

    高手朋友:
    你说的这些很简单,你不用说,我就能想到,我也会做。 我的问题不是这个。
    我的问题是:
    使用单个的checkbox,需要在dlg上放置32个checkbox,并且要为每个建成员变量,建事件处理函数,太繁琐了。我想找一个简洁的方法实现这个功能。感谢你的指教!
      

  11.   

    不需要建成员变量吧?只要ID按顺序走就行了。
    事件处理,只需要在处理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);
    }
     
      

  12.   

    写错了,是BS_CHECKBOX
    另外析构时需释放对象所占的内存。
    CYourDlg::~CYourDlg()
    {
         for (int i = 0; i < 32; i ++)
         {
              CButton* pCheck = (CButton*)GetDlgItem(1000 + i);
              delete pCheck;
         }