新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → 支持数据项查询功能地树控制(CTreeCtrl)类 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 3218 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 支持数据项查询功能地树控制(CTreeCtrl)类 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 支持数据项查询功能地树控制(CTreeCtrl)类

    一、树控制(CTree

            Control)


            树控制用于显示具有一定层次结构的数据项。很多应用程序都使用该控件,例如资源管理器中的磁盘目录等。


            树控制中有根数据项(root item),根数据项下包含各个子数据项(child item)。根数据项是所有子数据项的父亲,而这些子数据项是根数据项的孩子。所有子数据项互为兄妹(sibling)关系。每个数据项包括数据项名称(文本字符串)和用于表示该数据项的图像,每个数据项下还可以包含子项,整个结构就象一棵树。  

           二、使用树控制


            在MFC中,树控制被封装成CTreeCtrl类。下面我们谈谈树控制的创建、属性和操作方法。


            (1) 树控制的创建


            树控制一般用于对话框程序。创建树控制有两种方法,一种是静态创建,一种是动态创建。静态创建是指拖放控件后声明与之相关的成员变量来操作树控制。在对话框程序界面上拖放一个CTreeCtrl控件,然后通过ClassWizard添加一个CTreeCtrl类型的成员变量并在程序中使用它。动态创建是指在程序中使用Create函数创建树控制对象。本文例子采用静态创建的方法。


            (2) 树控制的属性


            树控制有很多属性操作函数。使用这些函数可以得到树控制的各种属性信息。例如:取得树控制中项数GetCount、取得树控制中项相对于父项的偏移值GetIndent、取得树控制图像列表控制句柄GetImageList等。具体信息可以查看MSDN帮助。


            (3) 数控制的操作


            树控制的操作方法包括插入一个树项InsertItem、删除一个树项DeleteItem、删除


            所有树项DeleteAllItems、展开或合拢树项的子项Expand、选中特定树项


            SelectItem、选择一个树项作为第一个可视树项SelectSetFirstVisible、编辑一个可


            视的树项EditLabel和排序给定父树项的子树项SortChildren等。  

           三、让树控制支持数据项查找功能


            在有些场合下用户需要在树控制中添加新的数据项。新添加的数据项可能和已有的某数据项名称重复。为避免这种情况,我们需要一个函数它能够在添加新数据项之前先检查所有的数据项,如果查到包含新添加数据项名称的数据项已存在,可以向用户提示该信息。使用递归方法来实现该函数相对简单。


            下面是该函数的原型、参数及代码。

    /***************************************************************

    *

    * 名称:FindItem

    *

    * 功能:在树控制中根据数据项名称查找数据项

    *

    * 参数:item    - 要查询的数据项及其子数据项

    *

    *       strText - 要查询的数据项名称

    *

    * 返回值:NULL  - 没找到

    *      

    *        (非空的HTREEITEM ) - 找到

    *

    ***************************************************************/

    HTREEITEM CTreeCtrlEx::FindItem(HTREEITEM item, CString strText)

    {

    HTREEITEM hFind;

    if(item == NULL)

      return NULL;

    while(item!=NULL)

    {

      if(GetItemText(item) == strText)

       return item;

      if(ItemHasChildren(item))

      {

       item = GetChildItem(item);

       hFind = FindItem(item,strText);  

       if(hFind)

       {

        return hFind;  

       }

       else

       {

       item= GetNextSiblingItem(GetParentItem(item));

       }

      }

      else

      {

       item = GetNextSiblingItem(item);

       if(item==NULL)

        return NULL;

      }  

    }


    return item;

    }

           四、示例程序


          我们创建一个对话框程序。


          (1) 通过“FILE->NEW->PROJECTS->MFC AppWizard(EXE)”建立名为MyTreeCtr的


          工程,在建立过程中选择基于对话框(Dialog based)的应用;


          (2) 将对话框中的默认按钮控件“确定”删除,并将所有对话框属性中的Language域设置为Chinese(P.R.C.),以使应用程序支持中文;在对话框窗口中添加树控制对象(TREE

          CONTROL),并设置一个按钮“新建数据项”,其对应标识分别如下:


          
      

          

             

              控制名称

              标题名称

              标识符号

              对应成员变量或函数

            

             

              树控制

               

              IDC_MYTREE

              CTreeCtrl m_ctrlTree

            

             

              按钮

              新建数据项

              IDC_ NEWITEM


              

              OnNewitem()

            

             

              树控制项目

               

               

              HTREEITEM m_hInsertItem

            

           

          (3) 处理树控制的TVN _BEGINLABELEDIT和TVN _ENDLABELEDIT消息,CMyTreeCtrlDlg增加OnBeginlabeleditMytree和OnEndlabeleditMytree两个处理函数。

       void CMyTreeCtrlDlg::OnBeginlabeleditMytree(NMHDR* pNMHDR, LRESULT* pResult)

    {

    TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;

    // TODO: Add your control notification handler code here

    m_ctrlTree.GetEditControl()->LimitText(16);

    *pResult = 0;

    }


    void CMyTreeCtrlDlg::OnEndlabeleditMytree(NMHDR* pNMHDR, LRESULT* pResult)

    {

    TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;

    // TODO: Add your control notification handler code here

    CString strName;

    m_ctrlTree.GetEditControl()->GetWindowText(strName);

    if(strName.IsEmpty())

    {

      AfxMessageBox(_T("数据项名称不能为空,请重新输入!"));

      CEdit* pEdit = m_ctrlTree.EditLabel(m_hInsertItem);

      ASSERT(pEdit != NULL);

      return;

    }


    HTREEITEM hRoot = m_ctrlTree.GetRootItem();

    HTREEITEM hFind = m_ctrlTree.FindItem(hRoot,strName);

    if(hFind==NULL)

    {

      char msg[64]={0};

      sprintf(msg,"新添加数据项名称 %s ,确定吗?",strName);

      if(MessageBox(msg,_T("提示"),MB_OKCANCEL) == IDOK)

       *pResult = TRUE;

      else

       m_ctrlTree.DeleteItem(m_hInsertItem);

    }

    else

    {

      AfxMessageBox(_T("该数据项已存在,请重新输入!"));

      CEdit* pEdit = m_ctrlTree.EditLabel(m_hInsertItem);

      ASSERT(pEdit != NULL);

      *pResult = 0;  

    }

    }

           五、结束语


          CTreeCtrlEx类的FindItem函数实现数据项查找的功能。

    下载本文示例源代码



       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/8/20 16:25:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/23 0:12:53

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    78.003ms