程序有一个ListCtrl控件,使用了CheckBox样式然后在这个ListCtrl下有一个复选框来全选/取消全选ListCtrl的CheckBox设计要求实现:当点击ListCtrl里面的复选框时,检查所有Item的状态,如果所有Item前面的CheckBox都被选中了,那么ListCtrl下的复选框就要求被选中。如果ListCtrl里面被选中的复选框数量小于总的数量,那么ListCtrl下的复选框就要求被清除选中状态。我使用了ON_NOTIFY(NM_CLICK, IDC_LIST1, OnClickList1)但是发现,当我选中一个ListCtrl里面Item前的复选框时,会执行OnClickList1()函数,只有当OnClickList1()执行完成以后,ListCtrl前面的复选框状态才会被选中。这样一来,我程序就出现问题了。我的代码如下:
void CMyListCtrlDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
int n = m_List.GetItemCount ();
int i=0;
while ( n > 0)
{
if (m_List.GetCheck ( n-1 ) == 1)
{
i++;
}
n--;
}
if (i==0)
m_Check.SetCheck (BST_UNCHECKED);
else if ( i == m_List.GetItemCount ())
m_Check.SetCheck (BST_CHECKED);
else
m_Check.SetCheck (BST_UNCHECKED);
}请问如何实现设计所要求的功能。************************************
   不使用 state image 
***********************************

解决方案 »

  1.   

    不知道你的m_Check是什么变量,但是SetCheck()函数居然没有和索引 i 联系起来,肯定是不对的,要选中或者取消选中,必须用:
    BOOL SetCheck( int nItem, BOOL fCheck = TRUE );
    函数,这个函数的第一个参数序号,否则,你取消或者选中哪个Checkbox?你的 i 没有起作用啊至于你前面描述的所要实现的功能也不是很清楚,最起码我没有看很明白:
    1、“如果所有Item前面的CheckBox都被选中了,那么ListCtrl下的复选框就要求被选中”,既然已经被全部选中,干嘛还要进行操作,你单击的那个Item也处于选中状态啊;
    2、“如果ListCtrl里面被选中的复选框数量小于总的数量,那么ListCtrl下的复选框就要求被清除选中状态。”这个功能有点意思,因为如果靠人为鼠标选中的话,可能你永远选不中任何Item还有就是,你说出问题了,你问问题的时候,就得把出了什么问题说出来,而不是靠被人凭代码去想,这对你的问题得到答复很有好处呵呵,说多了,楼主见谅
      

  2.   

    SetCheck()函数参数是我写漏了,这个不是什么大不了的事情
    至于响应,我说的很清楚了,由于NM_CLICK是在一点击就响应的消息,这个程序对Getcheck判断,还不能获知复选框已经被选中,因为只有当鼠标左键Up以后复选框才被选中的请楼上的2星会员自己试试看看就知道我说的是什么意思了
      

  3.   

    呵呵,既然楼主把误导别人花时间帮你解决问题都看作“没什么大不了”,我也就没有必要费心思了而且麻烦您再仔细看一下“如果所有Item前面的CheckBox都被选中了,那么ListCtrl下的复选框就要求被选中”这句话什么意思,看看和你上面的说的是不是一样的,单击的时候还没有对CheckBox起作用,那就更加说明该Item原来是选中的,还要进行选中操作?不用尝试我也知道我回答问题,从来和“星级”没有关系,完完全全是为了解决问题,别用什么级别来压我,呵呵
      

  4.   

    “单击的时候还没有对CheckBox起作用,那就更加说明该Item原来是选中的”搞笑啊
    你创建一个带有CHECKBOX样式的ListCtrl控件m_List.SetExtendedStyle (LVS_EX_CHECKBOXES);运行看看,会处于选中状态吗?我已经说的很明白了来做一个实验
    在一个对话框里面拖入1个ListCtrl控件和一个CheckBox控件IDC_LIST1      m_List        CListCtrl m_List;
    IDC_CHECK1     m_Check       CButton m_Check;OnInitDialog()创建2行2列
    m_List.InsertItem (0,"1");
    m_List.InsertItem (1,"2");
    m_List.InsertColumn (0,"1",LVCFMT_LEFT,200);
    m_List.InsertColumn (1,"1",LVCFMT_LEFT,200); m_List.SetExtendedStyle (LVS_EX_CHECKBOXES);处理ListCtrl控件的NM_CLICK消息
    ON_NOTIFY(NM_CLICK, IDC_LIST1, OnClickList1)void CTestDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    if ( m_List.GetCheck (0) == 1)
    m_Check.SetCheck (1);
    *pResult = 0;
    }编译、运行测试过程
    1、点击第一行(Index 为0的那行)前面的CheckBox,确认出现选中状态,注意ListCtrl下方的CheckBox并没有被选中,而代码里面写的是
    if ( m_List.GetCheck (0) == 1)
    m_Check.SetCheck (1);2、在ListCtrl里面任意地方点击,会发现ListCtrl下方的CheckBox并被选中了明白了吗?
      

  5.   

    真不好意思,是我搞笑了,而且也明白了,呵呵,我就不在这里出丑了,希望后面跟贴的人注意楼主一再强调的“ListCtrl下的复选框”的意思,我一直误会成“ListCtrl中被单击的那个Item的复选框”,出丑了,浪费了楼主那么多精神,不好意思再呆了,闪了