C++ CTreeview的checkbox使用方法

 更新时间:2015年06月29日 12:38:25   投稿:hebedich  
这篇文章主要介绍了C++ CTreeview的checkbox使用方法的相关资料,需要的朋友可以参考下

1. 消息事件

   (1)鼠标点击当前ITEM的CHECKBOX:引发NM_CLICK事件并传递TVHT_ONITEMSTATEICON。
   (2)鼠标点击当前ITEM的TEXT:引发NM_CLICK事件。
   (3)鼠标点击新ITEM的CHECKBOX:引发TVN_SELCHANGED事件、NM_CLICK事件并传递TVHT_ONITEMSTATEICON。
   (4)鼠标点击新ITEM的TEXT:引发NM_CLICK事件、TVN_SELCHANGED事件。

2. 消息事件总结

   点击ITEM会引发NM_CLICK事件。若点击CHECKBOX则传递TVHT_ONITEMSTATEICON。
   因此可不处理TVN_SELCHANGED事件而只处理NM_CLICK事件。

3. 消息处理注意事项

   (1)点击CHECKBOX后会自动更新CheckBox的状态,因此在处理代码中不需要使用SetCheck函数设置状态,而GetCheck函数返回也是其原始状态。
   (2)点击新CHECKBOX后不会自动将对应的ITEM设置为选择状态,需要使用SelectItem函数进行设置。

4. 使用方法

   (1)若传递TVHT_ONITEMSTATEICON
          获取选择ITEM的状态并取反
              若有子项则所有子项设置为一致
              若没有子项则
                  若当前状态为TRUE则设置父项为TRUE;否则遍历所有兄弟项,若全为FALSE则设置父项为FALSE。
         若选择了新ITEM则设置新ITEM为选择项
   (2)若未传递TVHT_ONITEMSTATEICON
          设置更新ITEM状态,获取选择ITEM的状态
              若有子项则所有子项设置为一致
              若没有子项则
                  若当前状态为TRUE则设置父项为TRUE;否则遍历所有兄弟项,若全为FALSE则设置父项为FALSE。

5. 响应NM_CLICK事件的函数代码

void CTestTimerDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult)
{
  // TODO: Add your control notification handler code here
  CPoint point;
  UINT uFlag;                 //接收有关点击测试的信息的整数
  HTREEITEM hTree;
  BOOL bCheck;
  GetCursorPos(&point);            //获取屏幕鼠标坐标
  m_TreeCtrl.ScreenToClient(&point);      //转化成客户坐标
  hTree = m_TreeCtrl.HitTest(point,&uFlag);  //返回与CtreeTtrl关联的光标的当前位置和句柄
  if((TVHT_NOWHERE & uFlag))
  {
    return;
  }
  if (hTree && (TVHT_ONITEMSTATEICON & uFlag)) //点中复选框
  {
    m_TreeCtrl.SelectItem(hTree);
    CString temp = m_TreeCtrl.GetItemText(hTree) + "\r\n";
    TRACE(temp);
    bCheck = m_TreeCtrl.GetCheck(hTree);   //获取当前复选状态
    SetChildCheck(hTree,!bCheck);       //设置子项复选状态
    SetParentCheck(hTree, bCheck);       //设置父项复选状态
  }
  *pResult = 0;
}

void CTestTimerDlg::SetChildCheck(HTREEITEM hTree,BOOL bCheck)
{
  m_TreeCtrl.Expand(hTree,TVE_EXPAND);
  hTree = m_TreeCtrl.GetChildItem(hTree); //获取子项句柄
  while (hTree)
  {
    m_TreeCtrl.SetCheck(hTree, bCheck);   
    SetChildCheck(hTree,bCheck);      //递归调用
    hTree = m_TreeCtrl.GetNextSiblingItem(hTree);  //获取兄弟的句柄
  }
}

void CTestTimerDlg::SetParentCheck(HTREEITEM hTree,BOOL bCheck)
{
  HTREEITEM hParent = m_TreeCtrl.GetParentItem(hTree);
  if (hParent)
  {
    HTREEITEM hChild = m_TreeCtrl.GetChildItem(hParent);
    while (hChild)
    {
      if (hChild == hTree)
      {
        hChild = m_TreeCtrl.GetNextSiblingItem(hChild);
        continue;
      }
      BOOL bflag = m_TreeCtrl.GetCheck(hChild);
      if (bCheck == bflag)         //判断是否还有兄弟项被选择
      {
        return;
      }
      hChild = m_TreeCtrl.GetNextSiblingItem(hChild);
    }
    m_TreeCtrl.SetCheck(hParent,!bCheck);
    SetParentCheck(hParent,bCheck);       //设置父项的状态
  }

相关文章

  • C\C++ 获取当前路径实例详解

    C\C++ 获取当前路径实例详解

    这篇文章主要介绍了C\C++ 获取当前路径实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C语言入门篇--充分理解操作符

    C语言入门篇--充分理解操作符

    本篇文章是基础篇,适合c语言刚入门的朋友,本文主要介绍了c语言的操作符基础理论,希望可以帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08
  • C语言中switch语句基本用法实例

    C语言中switch语句基本用法实例

    switch的中文翻译是开关,顾名思义,开关的作用就是控制连通或者中断,在C语言中switch语句的作用也是大同小异,下面这篇文章主要给大家介绍了关于C语言中switch语句基本用法的相关资料,需要的朋友可以参考下
    2022-07-07
  • C语言学习之关键字的示例详解

    C语言学习之关键字的示例详解

    关键字,这名字一听,就很关键。而有些关键字,你可能不是很了解,更别谈使用。所以,这篇文章将带你见识常见的关键字,一起领略它们的风采吧
    2022-10-10
  • 深入理解堆排序及其分析

    深入理解堆排序及其分析

    本篇文章是对堆排进行了详细的分析以及介绍,需要的朋友参考下
    2013-05-05
  • 利用Matlab实现迭代适应点算法

    利用Matlab实现迭代适应点算法

    道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法、迭代适应点算法、分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算法。本文将利用Matlab实现这一算法,需要的可以参考一下
    2022-04-04
  • C语言 自增自减运算的区别详解及实例

    C语言 自增自减运算的区别详解及实例

    这篇文章主要介绍了C语言中的++a和a++的区别详解及实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • STL常用容器详细解析

    STL常用容器详细解析

    这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stac)
    2013-09-09
  • C语言中getchar函数详解看这一篇就够了(函数功能、使用、返回值)

    C语言中getchar函数详解看这一篇就够了(函数功能、使用、返回值)

    getchar读取字符的函数,今天通过本文给大家介绍C语言中getchar函数简介用法示例详解,感兴趣的朋友跟随小编一起看看吧
    2023-02-02
  • 总结UNIX/LINUX下C++程序计时的方法

    总结UNIX/LINUX下C++程序计时的方法

    本文总结了下UNIX/LINUX下C++程序计时的一些函数和方法,对日常使用C++程序的朋友很有帮助,有需要的小伙伴们可以参考学习,下面一起来看看吧。
    2016-08-08

最新评论