`
fpwjp
  • 浏览: 45965 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

对话框高级编程---公共控件之四(树视控件)

    博客分类:
  • C++
阅读更多

      树视(tree view)控件也称树控件,用于表示有层次关系的事物或能够进行分类划分的对象。树视控件中每个项目由项目名称和一个可选择的图标组成,其中的项目分为父项目昨子项目。一个父项目拥有一个子项目列表,双击该父项目可以展开或折叠其中的子项目。一个父项目拥有一个子项目列表,双击该父项目可以展开或折叠其中的子项目。父项目位于子项目的上一层,子项目又可以是低一层子项目的父项目,最上一个层的叫做根节点(root node),最低一层的项目叫叶节点(leaf node),介于它们之间的项目叫做枝节点(branch node)。

      树视控件的应用也比较广泛,如Developer Studio的项目工作区窗口就使用了树视控件。树视控件有时与列表视控件一起使用,如Windows资源管理器左侧视图目录窗口使用一个树视图类CTreeView,而这种视图馀离一个与视图关联的树视控件。

      有关树视控件的数据结构有几个,其中编程时经常要用到的数据结构是TV_ITEM结构和TV_INSERTSTRUCT结构。TVITEM结构(等同于TV_ITEM结构)用于定义项目,TVINSERTSTRUCT结构(等同于TV_INSERTSTRUCT结构)用于定义插入项,该结构含有一个TV_ITEM的结构成员,因此它实际上包含了要插入项目的属性。下面绘出TV_ITEM结构和TV_INSERTSTRUCT结构的定义。

typedef struct _TVITEM{
	UINT mask;			//掩码,说明TVITEM结构中哪些成员函数
	HTREEITEM hItem;	//项目句柄
	UINT state;			//项目的状态
	UINT stateMask;		//状态有效的屏蔽位
	LPSTR pszText;		//项目名称
	int cchTextMax;		//项目名称字符串的最大长度
	int iImage;			//当项目没有选中的关联图像列表的图像索引值
	int iSelectedImage;	//当项目选中时关联图像列表的图像索引值
	int cChildren;		//该项目是否包含子项目
	LPARAM lParam;		//程序定义的32位参数
}TVITEM,FAR* LPTVITEM;
typedef struct _TVINSERTSTRUCT{
	HTREEITEM hParent;	//要插入项的父项目的句柄
	HTREEITEM hInsertAfter;//要插入上一项的句柄或位置标志值
	TV_ITEM item;		//要插入的项目
}TVINSERTSTRUCT,FAR* LPTVINSERTSTRUCT;

      编程使用树视控件时经常需要重新设置控件的有关属性,树视控件常用的属性有:Has buttons表示父项目的前有一个“+”或"-"按钮可以展开或折叠项目;has lines表示用连线项目之间的层次关系;Lines at root表示在项目的最高层用连接项目与根节点连接;Edit labels表示可以编辑项目的名称;Check boxes表示项目的左侧有一个复选框;Single expand表示单击项目可以展开或折叠该项目。

     封装树视控件的MFC类是CTreeCtrl类,CTreeCtrl类提供了对树视控件进行管理的成员函数,其中很多成员函数的功能与列表视控件类CListCtrl的成员函数相似,如项目的添加和删除,关联图像列表的设置等。CTreeCtrl类主要的成员函数有:InsertItem()或DeleteItem() 函数插入或删除一个项目;GetSelectedItem()函数返回当前选中的项目;GetChildItem()或GetParentItem()函数返回一个项目的子项目或父项目;GetRootItem()函数返回根项目;GetItemText()或SetItemText()函数获取或设置项目的文本串;Expand()函数展开或折叠项目;SetImageList()函数设置与树控件关联的图像列表。树视控件产生的消息也列表控件类似。

 

     例: 编写一个对话框应用程序MyTree,对话框中有一具树视控件和其他一些如图1所示的按钮。树视控件用于显示一些有层次关系的项目,用户可通过“增加”或“删除”按钮向树视控件窗口添加或删除一个项目。

 

图1 对话框模板资源

     [编程说明与实现]

     (1)利用MFC AppWizard向导创建一个对话框应用程序MyTree,将对话框的标题改为“使用树视控件”。向对话框添加一个ID为IDC_TREECTL的树视控件,并设置控件的非默认属性Has buttons、Has lines和Lines at root。再向对话框添加“增加”(IDC_BUTNADD)和“删除”(IDC_BUTNDEL)两个命令按钮。利用ClassWizard类向志为树视控件添加一个类型为CTreeCtrl的成员变量m_TreeCtl。

     (2)在对话框类初始脂成员函数OnInitDialog()中添加代码,模拟Developer Studio的项目工作区窗口,向树视控件加入一些项目。

    

BOOL CMyTreeDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	HTREEITEM hItemRoot,hItemClass,hItemRes,hItemFile;	//声明项目句柄
	hItemRoot=m_TreeCtl.InsertItem("Project",TVI_ROOT);	//插入根项目Project
	hItemClass=m_TreeCtl.InsertItem("Class",hItemRoot);//在根项目下面插入二级子项目
	hItemRes=m_TreeCtl.InsertItem("Resource",hItemRoot);
	hItemFile=m_TreeCtl.InsertItem("File",hItemRoot);
	m_TreeCtl.InsertItem("CMyDialog",hItemClass);	//在二级子项目下面插入三级子项目
	m_TreeCtl.InsertItem("Dialog",hItemRes);
	HTREEITEM hTreeSourF=m_TreeCtl.InsertItem("Source Files",hItemFile);
	TVITEM tvItem;		//InsertItem()成员函数有多种重载形式,声明要插入的项目
	tvItem.mask=TVIF_TEXT;
	tvItem.pszText="MyTreeDlg.cpp";
	TV_INSERTSTRUCT tvInsert;		//声明插入项
	tvInsert.hParent=hTreeSourF;
	tvInsert.hInsertAfter=TVI_LAST;
	tvInsert.item=tvItem;		//要插入的项目
	m_TreeCtl.InsertItem(&tvInsert);		//在子项目Source Files下面插入子项目
	
	tvItem.mask=TVIF_TEXT;
	tvItem.pszText="InputDlg.cpp";
	tvInsert.hParent=hTreeSourF;
	tvInsert.hInsertAfter=TVI_LAST;
	tvInsert.item=tvItem;		//要插入的项目
	m_TreeCtl.InsertItem(&tvInsert);		//在子项目Source Files下面插入子项目
	return TRUE;  // return TRUE  unless you set the focus to a control
}

       (3)单击“增加”按钮可以为树视控件窗口添加项目,而项目名称通过一个对话框进行输入,因此向项目添加一个ID为IDD_INPUT、标题为“请输入项目名称”的对话框,并向对话框添加一个ID为IDC_EDITITEM的编辑框和对应的静态文本控件。利用ClassWizard类向导创建对话框类CInputDlg,并为编辑框添加一个类型为CString的成员变量m_strItem。

      (4)为“使用树视控件”对话框上的“增加”按钮添加BN_CLICKED消息处理函数,执行该函数时弹电子邮件"请输入项目名称"对话框,根据输入内容添加新的项目。
     

void CMyTreeDlg::OnButnadd() 
{
	// TODO: Add your control notification handler code here
	CInputDlg dlg;
	if(dlg.DoModal()==IDOK)
	{
		if(dlg.m_strItem=="") 
		{
			MessageBox("项目名称为空!");
			return;	
		}//当没有输入名称时返回
		CString strItem=dlg.m_strItem;
		MessageBox(strItem);
		HTREEITEM hItem=m_TreeCtl.GetSelectedItem();	//获得树视控件的当前项目
		m_TreeCtl.InsertItem(strItem,hItem);			//在当前项目下面添加新项目
		m_TreeCtl.Expand(hItem,TVE_EXPAND);				//展开项目
	}
}

    (5)单击“删除”按钮可以删除树视控件窗口中当前项目,利用ClassWizard类向导为“删除”按钮添加BN_CLICKED消息处理函数。

void CMyTreeDlg::OnButndel() 
{
	// TODO: Add your control notification handler code here
	HTREEITEM hItem=m_TreeCtl.GetSelectedItem();	//获得当前项目
	if(hItem != NULL) m_TreeCtl.DeleteItem(hItem);	//删除当前项目及它的下级项目
}

    在MyTreeDlg.cpp文件的开始位置用#include指令包含InputDlg.h头文件。编译、链接并执行应用程序MyTree后,在树视控件窗口显示了已添加项目。可以向树视控件窗口添加或删除项目,其运行结果如图所示。

 

 



  

  • 描述: 对话框模板资源
  • 大小: 7.2 KB
  • 描述: 树视控件示例运行结果
  • 大小: 6.9 KB
  • 描述: 添加子项目的运行示例
  • 大小: 10.4 KB
分享到:
评论

相关推荐

    对话框高级编程---公共控件之一(旋转按钮、滑块和进度条)

    这篇博客“对话框高级编程——公共控件之一(旋转按钮、滑块和进度条)”主要探讨了三种常用的公共控件:旋转按钮(Spin Button)、滑块(Slider)和进度条(Progress Bar),并提供了源码示例。这些控件在很多应用...

    对话框高级编程---公共控件之四(列表视控件)

    在对话框编程中,我们通常使用`CreateWindow`或`CreateWindowEx`函数创建列表视控件,并通过`LVS_ICON`, `LVS_SMALLICON`, `LVS_LIST` 或 `LVS_REPORT` 样式来指定视图模式。 创建列表视控件后,我们需要添加列头以...

    对话框高级编程---公共控件之二(标签控件和属性表)

    本文将深入探讨对话框的高级编程,特别是公共控件的使用,主要关注标签控件(TabControl)和属性表(Property Sheet),这两种控件在创建具有多选项卡界面的应用程序中非常常见。 标签控件(TabControl)是一种允许...

    对话框高级编程---公共控件之三(图像列表)

    在Windows编程中,对话框(Dialog Box)是用户与应用程序交互的重要组件,它可以包含各种控件,如按钮、文本框、列表视图等。而“图像列表”(Image List)则是对话框中一种非常实用的控件,它可以用于管理一组小...

    对话框高级编程---非模态对话框

    在本文中,我们将深入探讨非模态对话框的高级编程技术,包括其工作原理、创建过程以及如何在实际项目中应用。 非模态对话框(Non-Modal Dialog)与模态对话框(Modal Dialog)的最大区别在于用户可以同时操作主窗口...

    Vc++的对话框小程序--简单计算器

    这个项目涉及到了许多核心的编程概念和技术,包括MFC(Microsoft Foundation Classes)、控件的使用、事件处理以及对话框的布局管理。下面将详细阐述这些知识点。 首先,VC++中的MFC库为开发者提供了构建Windows...

    商业编程-源码-ljh Dialog 弹出对话框控件.zip

    在这个"商业编程-源码-ljh Dialog 弹出对话框控件.zip"压缩包中,包含的是一个专门用于创建自定义对话框的源码实现,名为"ljh Dialog"。这个控件可能是一个面向商业应用的组件,旨在提供更加灵活和定制化的对话框...

    MFC基于对话框小程序-24小游戏 (附源代码)

    在24点游戏的开发中,我们通常会创建一个基于对话框的应用程序,这个对话框包含必要的控件,如按钮、文本框等,供用户输入数字并进行计算。开发者需要定义一个继承自CDialog的类,并在该类中处理各种消息,如WM_...

    对话框修改UI-易语言.zip

    在易语言编程环境中,对话框(Dialog Box)是用户界面(UI)的重要组成部分,它用于与用户进行交互,展示信息或获取用户输入。本压缩包“对话框修改UI-易语言.zip”(实际上可能是rar文件)很可能是包含了一系列关于...

    VC++树形控件--对话框

    在VC++编程环境中,树形控件(Tree Control)是一种常用的数据展示组件,它能够以层级结构的形式展示信息,常用于文件系统、目录结构或自定义数据组织的显示。本教程将深入探讨如何在对话框中集成并使用树形控件,这...

    商业编程-源码-为对话框中的控件增加提示的简单方法.zip

    "商业编程-源码-为对话框中的控件增加提示的简单方法.zip" 这个压缩包文件,显然包含了如何在对话框的各个控件上添加提示信息的源代码示例。这些提示通常称为“工具提示”或“气泡提示”,它们可以在用户将鼠标悬停...

    精彩编程与编程技巧-从公共对话框控件中提取多个文件名称...

    公共对话框控件是一种在Windows系统中广泛使用的用户界面元素,用于提供标准的文件打开、保存、颜色选择等对话框。这些对话框提供了统一的操作方式,使得用户能够方便快捷地完成常见的操作。 #### 二、从公共对话框...

    【易语言】控件大全使用教程

    控件-通用对话框 控件-数据源 控件-数据提供者-数据库提供者 控件-数据报 控件-树形框 控件-时钟 控件-日期框-月历 控件-驱动器框 控件-命令条及状态条 控件-列表框 控件-进度条 控件-画板 控件-滑块条 ...

    商业编程-源码-在对话框程序中使用动画控件.zip

    这个压缩包“商业编程-源码-在对话框程序中使用动画控件.zip”显然包含了关于如何在对话框程序中集成和操作动画控件的源代码示例。 首先,我们要理解什么是对话框程序。对话框程序是Windows操作系统中的一种用户...

    在VS2013上的MFC树控件操作(连接对话框)

    在Microsoft Visual Studio 2013 (VS2013) 中进行MFC(Microsoft Foundation Classes)编程时,树控件(CTreeCtrl)是一种常用的功能丰富的用户界面元素,用于展示层次化的数据结构。对话框(Dialog)是MFC应用程序...

Global site tag (gtag.js) - Google Analytics