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);              //设置父项的状态
    }
时间: 2024-11-11 21:35:41

C++ CTreeview的checkbox使用方法的相关文章

jquery操作checkbox最佳方法

使用.is(":checked") 判断是否被选择 选中为:true 未选中为:false  该值不是字符串“true ”,“false” 使用.prop("checked", true/flase)设置复选框是否选中  不要使用.attr()方法 使用上述方式 兼容性最好  不过还是存在一些问题

通过javascript获取被勾选的checkbox解决方法

思路: 用javascript的dom操作获取节点,并获取其属性,得到要获取的类的id的String,发给后台,截取String,获得该类的List. 需要注意的是: 不知道为什么getIlementById("id").getAttribute("value")获取不到,value属性.所以选择getIlementById("id").getAttribute("title")来获取写在title中的属性. 具体实现: li

jQuery操作CheckBox的方法(选中,取消,取值)详解

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New document.nbsp;</TITLE> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <SCR

jquery checkbox radio 标签 选中的3种方法

张映 发表于 2013-07-16 分类目录: js/jquery jquery 很灵活,checkbox radio标签选中的方法有很多,在这儿就例举三个常用的方法. 一,测试html 查看复制打印? <div style="margin-top:150px;"> <input type='checkbox' name='test[]' class='checkbox' value='checkbox1'>checkbox1 <input type='c

PHP中如何获取多个checkbox的值

< input type="checkbox" name="weeks[]" id="weeks" value=1> < input type="checkbox" name="weeks[]" id="weeks" value=2> < input type="checkbox" name="weeks[]" id=

关于列表中checkbox选中,全选/反选设置

关于列表中checkbox选中,全选设置 1 <html> 2 <head> 3 <script type="text/javascript"> 4 //点击行时,checkbox处理方法 5 function doclick(id){ 6 var allche = document.getElementById("allid");//全选checkbox 7 var che = document.getElementsByNam

改变QTreeView项高的方法(改变Delegate行高,或者::data取数据的时候,根据Qt::SizeHintRole进行判断)

很久之前写过一篇关于QTreeView快速显示超过千万条数据项的方法,如果说那篇文章讲的是QTreeView的内功的话,今天这篇是讲QTreeView的外功,有时我们想改变视图的数据项的行高,那怎么办呢?今天在这里介绍两种改变行高的方法: 1.通过更改QTreeView的默认delegate的方法 [cpp] view plain copy class CDelegate : public QStyledItemDelegate { Q_OBJECT public: CDelegate(QObj

ASP.Net MVC开发基础学习笔记(2):HtmlHelper与扩展方法

一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归.所以抛弃之前的那种事件响应的模型,抛弃服务器端控件也理所当然. 但是,如果手写Html标签效率又比较低,可重用度比较低.这时,我们该怎样来提高效率呢?首先,经过上篇我们知道可以通过ViewData传递数据,于是我们可以写出以下的Html代码: 1 <input name="UserName&q

(转)表单和HTML辅助方法 - ASP.NET MVC 3

——选自<ASP.NET MVC3 高级编程(第5章)  孙远帅 译> ——微软ASP.NET MVC系列书籍地址: http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-3.productCd-1118076583.html 第5章 表单和HTML辅助方法  本章内容简介: * 理解表单 * 如何利用HTML辅助方法 * 编辑和输入的辅助方法 * 显示和渲染的辅助方法 顾名思义,HTML辅助方法是用来辅助HTML开发的