• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

支持数据项查找功能的树控制(CTreeCtrl)类

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 22次 | 进入软件测试论坛讨论

领测软件测试网

代码运行效果图如下:

一、树控制(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函数实现数据项查找的功能。测试程序在Win98+VC6.0环境下测试通过。有何问题请来信:[email protected]


延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网