Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35569
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 142
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-28 20:06
文章分类

全部博文(14)

文章存档

2016年(8)

2015年(7)

我的朋友

分类: C/C++

2015-12-16 20:46:07

      树形控件的学习需要掌握树形控件的创建、相关结构、通知消息、 CTreeCtrl类的主要成员函数。树形控件主要元素为节点,节点上有两元素:标签和图标。标签即为节点上显示的文字,图标为显示在标签右边的小图片,图标的添加需要用到图像序列。本文主要针对树形控件实现节点图标显示、节点标签更改、鼠标划过节点时显示相应的Tip提示信息、子对话框间切换等功能。

一.树形控件的创建

     树形控件的创建有两种方式,一种是在对话框模板中直接拖入Tree Control控件创建,另一种就是通过CTreeCtrl类的Create成员函数动态创建。

    动态创建时, CTreeCtrl类的Create成员函数的原型如下:

       virtual BOOL Create(
              DWORD dwStyle,
              const RECT& rect,
              CWnd* pParentWnd,
              UINT nID  );
     dwStyle指定树形控件风格的组合,rect指定树形控件窗口的位置和大小,pParentWnd为指向树形控件父窗口的指针,nID指定树形控件的ID。下面还是主要讲讲树形控件的主要风格以及含义。

      TVS_DISABLEDRAGDROP:禁止树形控件发送TVN_BEGINDRAG通知消息,即不支持拖动操作
       TVS_EDITLABELS:用户可以编辑节点的标签文本
       TVS_HASBUTTONS:显示带有"+"或"-"的小方框来表示某项能否被展开或已展开
       TVS_HASLINES:在父节点与子节点间连线以更清晰地显示树的结构
       TVS_LINESATROOT:在根节点处连线
       TVS_SHOWSELALWAYS:即使控件失去输入焦点,仍显示出项的选择状态

     采用第一种方法创建时,在中直接拖入Tree Control创建树形控件时,可以在树形控件的属性页中设置其风格,与上面的风格是对应的,例如,属性Has Lines对应的就是TVS_HASLINES风格。

二.树形控件的相关结构

 1. HTREEITEM句柄

       树形控件中的每个节点都可以由一个HTREEITEM类型的句柄表示。我们通过CTreeCtrl类的成员函数对树进行访问和操作时,很多时候都要用到HTREEITEM句柄。

2. TVITEM结构体

       TVITEM结构体描述了树形控件节点的属性,定义如下:

点击(此处)折叠或打开

  1. typedef struct tagTVITEM {
  2.     UINT mask; // 包含一些掩码位(下面的括号中列出)的组合,用来表明结构的哪些成员是有效的
  3.     HTREEITEM hItem; // 树节点的句柄(TVIF_HANDLE)
  4.     UINT state; // 树节点的状态(TVIF_STATE)
  5.     UINT stateMask; // 状态的掩码组合(TVIF_STATE)
  6.     LPTSTR pszText; // 树节点的标签文本(TVIF_TEXT)
  7.     int cchTextMax; // 标签文本缓冲区的大小(TVIF_TEXT)
  8.     int iImage; // 树节点的图像索引(TVIF_IMAGE)
  9.     int iSelectedImage; // 选中项的图像索引(TVIF_SELECTEDIMAGE)
  10.     int cChildren; // 表明节点是否有子节点,为1则有,为0则没有(TVIF_CHILDREN)
  11.     LPARAM lParam; // 一个32 位的附加数据(TVIF_PARAM)
  12. } TVITEM, *LPTVITEM;
      树形控件节点需要显示图标时,就要为树形控件关联一个图像序列,上面的iImage成员就代表了该结构体对应的树节点的图标在图像序列中的索引,iSelectedImage则代表该树节点被选中时显示的图标在图像序列中的索引。stateMask用来说明要获取或设置树节点的哪些状态。

          state                            对应的stateMask                       含义         
       TVIS_CUT                          TVIS_CUT                        节点被选择用来进行剪切和粘贴操作
       TVIS_DROPHILITED           TVIS_DROPHILITED         节点成为拖动操作的目标
       TVIS_EXPANDED               TVIS_EXPANDED              节点的子节点被展开
       TVIS_EXPANDEDONCE      TVIS_EXPANDEDONCE     节点的子节点曾经被展开过
       TVIS_SELECTED                TVIS_SELECTED               节点被选中

       lParam在实际开发中常用来存放与树节点有关的附加数据。

3. NMTREEVIEW结构体

       NMTREEVIEW结构体中包含了树形控件通知消息的相关信息。树形控件的大多数通知消息都会带有指向该结构体的指针。

点击(此处)折叠或打开

  1. typedef struct tagNMTREEVIEW {
  2.     NMHDR hdr; // 标准的NMHDR结构
  3.     UINT action; // 表明是用户的什么行为触发了该通知消息
  4.     TVITEM itemOld; // 原节点的属性
  5.     TVITEM itemNew; // 新节点的属性
  6.     POINT ptDrag; // 事件发生时鼠标的客户区坐标
  7. } NMTREEVIEW, *LPNMTREEVIEW;

 4. TVINSERTSTRUCT结构体

       向树形控件中插入新节点时需要用到TVINSERTSTRUCT结构体,它常与TVM_INSERTITEM消息一起使用。

点击(此处)折叠或打开

  1. typedef struct tagTVINSERTSTRUCT {
  2.     HTREEITEM hParent; // 父节点的句柄
  3.     HTREEITEM hInsertAfter; // 指明插入到同层中哪一项的后面
  4. #if (_WIN32_IE >= 0x0400)
  5.     union
  6.     {
  7.         TVITEMEX itemex;
  8.         TVITEM item;
  9.     } DUMMYUNIONNAME;
  10. #else
  11.     TVITEM item; // 要添加的新节点的属性
  12. #endif
  13. } TVINSERTSTRUCT, *LPTVINSERTSTRUCT;
      若hParent成员为TVI_ROOT或NULL,那么新节点将被作为树的根节点插入。hInsertAfter除了可以是某个节点的句柄,还可以有四种取值:TVI_FIRST(插入到树形控件的最前面)、TVI_LAST(插入到树形控件的最后面)、TVI_ROOT(作为根节点插入)和TVI_SORT(按字母顺序插入)。


  5. NMTVDISPINFO结构体

       NMTVDISPINFO结构体中包含了与树节点的显示有关的信息。

点击(此处)折叠或打开

  1. typedef struct tagNMTVDISPINFO {
  2.     NMHDR hdr;
  3.     TVITEM item;
  4. } NMTVDISPINFO, *LPNMTVDISPINFO;

三.树形控件的通知消息

     TVN_SELCHANGING和TVN_SELCHANGED:在用户改变了对树节点的选择时,控件会发送这两个消息。消息会附带一个指向NMTREEVIEW结构的指针,程序可从该结构中获得必要的信息。两个消息都会在该结构的itemOld成员中包含原来的选择项信息,在itemNew成员中包含新选择项的信息,在action成员中表明是用户的什么行为触发了该通知消息(若是TVC_BYKEYBOARD则表明是键盘,若是TVC_BYMOUSE则表明是鼠标,若是TVC_UNKNOWN则表示未知)。
     TVN_KEYDOWN:该消息表明了一个键盘事件。消息会附带一个指向NMTVKEYDOWN结构的指针,通过该结构程序可以获得按键的信息。
     TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT:分别在用户开始编辑和结束编辑节点的标签时发送。消息会附带一个指向NMTVDISPINFO结构的指针,程序可从该结构中获得必要的信息。如果处理函数返回FALSE,则允许编辑,如果返回TRUE,则禁止编辑。在后者的消息处理函数中,NMTVDISPINFO结构中的item.pszText指向编辑后的新标题,如果pszText为NULL,那么说明用户放弃了编辑,否则,程序应负责更新节点的标签,这可以由SetItem()或SetItemText()函数来完成。

四. CTreeCtrl类的主要成员函数

  CImageList* SetImageList(CImageList * pImageList,int nImageListType)    

     
如果树节点需要显示图标时,则必须先创建一个CImageList类的对象,并为其添加多个图像组成一个图像序列,然后调用SetImageList函数为树形控件设置图像序列,在用InsertItem插入节点时传入所需图像在图像序列中的索引即可。后面的例子中会演示。参数pImageList为指向图像序列类CImageList的对象的指针,若为NULL则删除树形控件的所有图像。参数nImageListType指定图像序列的类型,可以是TVSIL_NORMAL(普通图像序列)或TVSIL_STATE(状态图像序列,用图像表示节点的状态)。

     DWORD_PTR GetItemData(HTREEITEM hItem) const;

     获取树形控件中某个指定节点的附加32位数据。参数hItem为指定的树节点的句柄。

      BOOL SetItemData(HTREEITEM hItem,DWORD_PTR dwData);

       为树形控件中某个指定节点设置附加的32位数据。参数hItem同上,dwData为要设置的32位数据。

       CString GetItemText(HTREEITEM hItem) const;

       获取树形控件中某个指定节点的标签文本。参数hItem同上。返回值是包含标签文本的字符串。

       BOOL SetItemText(HTREEITEM hItem,LPCTSTR lpszItem);

       为树形控件中某个指定节点设置标签文本。参数hItem同上,lpszItem为包含标签文本的字符串的指针。

       HTREEITEM GetNextSiblingItem(HTREEITEM hItem) const;

       获取树形控件中某个指定节点的下一个兄弟节点。参数hItem同上。返回值是下一个兄弟节点的句柄。

       HTREEITEM GetPrevSiblingItem(HTREEITEM hItem) const;

       获取树形控件中某个指定节点的上一个兄弟节点。参数hItem同上。返回值是上一个兄弟节点的句柄。

       HTREEITEM GetParentItem(HTREEITEM hItem) const;

       获取树形控件中某个指定节点的父节点。参数hItem同上。返回值是父节点的句柄。

       HTREEITEM GetRootItem( ) const;

       获取树形控件根节点的句柄。

      HTREEITEM GetSelectedItem( ) const;

       获取树形控件当前选中节点的句柄。

       BOOL DeleteAllItems( );

       删除树形控件中的所有节点。删除成功则返回TRUE,否则返回FALSE。

       BOOL DeleteItem(HTREEITEM hItem);

       删除树形控件中的某个节点。参数hItem为要删除的节点的句柄。删除成功则返回TRUE,否则返回FALSE。

       HTREEITEM InsertItem(LPCTSTR lpszItem,int nImage,int nSelectedImage,HTREEITEM hParent = TVI_ROOT,HTREEITEM hInsertAfter = TVI_LAST);

       在树形控件中插入一个新节点。参数lpszItem为新节点的标签文本字符串的指针,参数nImage为新节点的图标在树形控件图像序列中的索引,参数nSelectedImage为新节点被选中时的图标在图像序列中的索引,参数hParent为插入节点的父节点的句柄,参数hInsertAfter为新节点的前一个节点的句柄,即新节点将被插入到hInsertAfter节点之后。

       BOOL SelectItem(HTREEITEM hItem);

       选中指定的树节点。参数hItem为要选择的节点的句柄。若成功则返回TRUE,否则返回FALSE。

五.程序实例

1.简单步骤:创建基于对话框的MFC工程tree,删除掉“确定”和“取消”按钮,和静态文本框。添加树形控件,设置属性Has Buttons、Has Lines和Lines At Root都设为True,为了在鼠标划过某个节点时显示提示信息还需要将Info Tip和ToolTip属性设为True。在vs资源视图里添加Icon,在此自己画三个32x32的Icon图标;为树形控件添加变量m_tree,并在treeDlg.h文件中为treeDlg类添加成员对象:CImageList m_imageList;在对话框初始化时,编辑树形控件。在添加三个对话框时,其ID分别为IDC_DIALOG1、IDC_DIALOG2、IDC_DIALOG3,在treeDlg.h中添加 Cdialog * m_treepages[3],并在构造函数中为它们分配空间,要把对话框的属性style和Border设为child和NONE .如下为treeDlg.cpp

点击(此处)折叠或打开

  1. // treeDlg.cpp : 实现文件
  2. //

  3. #include "stdafx.h"
  4. #include "tree.h"
  5. #include "treeDlg.h"
  6. #include "afxdialogex.h"
  7. #include "Cdialog1.h"
  8. #include "Cdialog2.h"
  9. #include "Cdialog3.h"

  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #endif


  13. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框

  14. class CAboutDlg : public CDialogEx
  15. {
  16. public:
  17.     CAboutDlg();

  18. // 对话框数据
  19.     enum { IDD = IDD_ABOUTBOX };

  20.     protected:
  21.     virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

  22. // 实现
  23. protected:
  24.     DECLARE_MESSAGE_MAP()
  25. };

  26. CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  27. {
  28. }

  29. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  30. {
  31.     CDialogEx::DoDataExchange(pDX);
  32. }

  33. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  34. END_MESSAGE_MAP()


  35. // CtreeDlg 对话框




  36. CtreeDlg::CtreeDlg(CWnd* pParent /*=NULL*/)
  37.     : CDialogEx(CtreeDlg::IDD, pParent)
  38. {
  39.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  40.     m_treepages[0]=new Cdialog1;
  41.     m_treepages[1]=new Cdialog2;
  42.     m_treepages[2]=new Cdialog3;
  43. }

  44. void CtreeDlg::DoDataExchange(CDataExchange* pDX)
  45. {
  46.     CDialogEx::DoDataExchange(pDX);
  47.     DDX_Control(pDX, IDC_TREE1, m_tree);
  48. }

  49. BEGIN_MESSAGE_MAP(CtreeDlg, CDialogEx)
  50.     ON_WM_SYSCOMMAND()
  51.     ON_WM_PAINT()
  52.     ON_WM_QUERYDRAGICON()
  53.     ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CtreeDlg::OnSelchangedTree)
  54.     ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_TREE1, &CtreeDlg::OnBeginlabeleditTree)
  55.     ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE1, &CtreeDlg::OnEndlabeleditTree1)
  56.     ON_NOTIFY(TVN_GETINFOTIP, IDC_TREE1, &CtreeDlg::OnGetInfoTipTree)
  57.     
  58. END_MESSAGE_MAP()


  59. // CtreeDlg 消息处理程序

  60. BOOL CtreeDlg::OnInitDialog()
  61. {
  62.     CDialogEx::OnInitDialog();

  63.     // 将“关于...”菜单项添加到系统菜单中。

  64.     // IDM_ABOUTBOX 必须在系统命令范围内。
  65.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  66.     ASSERT(IDM_ABOUTBOX < 0xF000);

  67.     CMenu* pSysMenu = GetSystemMenu(FALSE);
  68.     if (pSysMenu != NULL)
  69.     {
  70.         BOOL bNameValid;
  71.         CString strAboutMenu;
  72.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  73.         ASSERT(bNameValid);
  74.         if (!strAboutMenu.IsEmpty())
  75.         {
  76.             pSysMenu->AppendMenu(MF_SEPARATOR);
  77.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  78.         }
  79.     }

  80.     // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  81.     // 执行此操作
  82.     SetIcon(m_hIcon, TRUE);            // 设置大图标
  83.     SetIcon(m_hIcon, FALSE);        // 设置小图标

  84.     // TODO: 在此添加额外的初始化代码
  85.     HTREEITEM hItem,hSubItem,hThidItem;
  86.     HICON hIcon[4];
  87.     hIcon[0]=AfxGetApp()->LoadIconW(IDI_Parent1);
  88.     hIcon[1]=AfxGetApp()->LoadIconW(IDI_Parent2);
  89.     hIcon[2]=AfxGetApp()->LoadIconW(IDI_Parent3);
  90.     hIcon[3]=AfxGetApp()->LoadIconW(IDR_MAINFRAME);
  91.     m_imagelist.Create(32,32,ILC_COLOR32,3,3);
  92.     for (int i=0; i<4; i++)
  93.     {
  94.         m_imagelist.Add(hIcon[i]);
  95.     }
  96.     m_tree.SetImageList(&m_imagelist, TVSIL_NORMAL);

  97.     hItem=m_tree.InsertItem(_T("Parent1"),3,3,TVI_ROOT);
  98.     hSubItem=m_tree.InsertItem(_T("child1"),1,1,hItem);
  99.     m_tree.SetItemData(hSubItem,1);
  100.     hThidItem=m_tree.InsertItem(_T("subchild1"),2,2,hSubItem);
  101.     m_tree.SetItemData(hThidItem,2);
  102.     hThidItem=m_tree.InsertItem(_T("subchild2"),2,2,hSubItem,hThidItem);
  103.     m_tree.SetItemData(hThidItem,3);
  104.     hSubItem=m_tree.InsertItem(_T("child2"),1,1,hItem);
  105.     m_tree.SetItemData(hSubItem,4);
  106.     hSubItem=m_tree.InsertItem(_T("child3"),1,1,hItem,hSubItem);
  107.     m_tree.SetItemData(hSubItem,5);
  108.     hSubItem=m_tree.InsertItem(_T("child4"),1,1,hItem,hSubItem);
  109.     m_tree.SetItemData(hSubItem,6);
  110.     hItem=m_tree.InsertItem(_T("Parent2"),3,3,TVI_ROOT); //作为一个根项添加
  111.     m_tree.SetItemData(hItem,7);
  112.     hItem=m_tree.InsertItem(_T("Parent3"),3,3,TVI_ROOT,hItem);
  113.     m_tree.SetItemData(hItem,8);

  114.     m_tree.SetBkColor(RGB(0,250,255));

  115.     m_treepages[0]->Create(IDD_DIALOG1,this);
  116.     m_treepages[1]->Create(IDD_DIALOG2,this);
  117.     m_treepages[2]->Create(IDD_DIALOG3,this);
  118.     m_treepages[0]->ShowWindow(SW_HIDE);
  119.     m_treepages[1]->ShowWindow(SW_HIDE);
  120.     m_treepages[2]->ShowWindow(SW_HIDE);
  121.     //把dialog放到合适的位置
  122.     CRect rect;
  123.     GetClientRect(rect);
  124.     rect.left=250;
  125.     m_treepages[0]->MoveWindow(rect);
  126.     m_treepages[1]->MoveWindow(rect);
  127.     m_treepages[2]->MoveWindow(rect);
  128.     return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  129. }

  130. void CtreeDlg::OnSysCommand(UINT nID, LPARAM lParam)
  131. {
  132.     if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  133.     {
  134.         CAboutDlg dlgAbout;
  135.         dlgAbout.DoModal();
  136.     }
  137.     else
  138.     {
  139.         CDialogEx::OnSysCommand(nID, lParam);
  140.     }
  141. }

  142. // 如果向对话框添加最小化按钮,则需要下面的代码
  143. // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  144. // 这将由框架自动完成。

  145. void CtreeDlg::OnPaint()
  146. {
  147.     if (IsIconic())
  148.     {
  149.         CPaintDC dc(this); // 用于绘制的设备上下文

  150.         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  151.         // 使图标在工作区矩形中居中
  152.         int cxIcon = GetSystemMetrics(SM_CXICON);
  153.         int cyIcon = GetSystemMetrics(SM_CYICON);
  154.         CRect rect;
  155.         GetClientRect(&rect);
  156.         int x = (rect.Width() - cxIcon + 1) / 2;
  157.         int y = (rect.Height() - cyIcon + 1) / 2;

  158.         // 绘制图标
  159.         dc.DrawIcon(x, y, m_hIcon);
  160.     }
  161.     else
  162.     {
  163.         CDialogEx::OnPaint();
  164.     }
  165. }

  166. //当用户拖动最小化窗口时系统调用此函数取得光标
  167. //显示。
  168. HCURSOR CtreeDlg::OnQueryDragIcon()
  169. {
  170.     return static_cast<HCURSOR>(m_hIcon);
  171. }



  172. void CtreeDlg::OnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult)
  173. {
  174.     LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
  175.     // TODO: 在此添加控件通知处理程序代码
  176.     UpdateData(true);
  177.     HTREEITEM selItem;
  178.     CString curtext;
  179.     //获得选择项
  180.     selItem=m_tree.GetSelectedItem();
  181.     curtext=m_tree.GetItemText(selItem);
  182.     SetDlgItemTextW(IDC_EDIT2,curtext);
  183.     SetWindowTextW(curtext);

  184.     if(curtext=="child1")
  185.     {
  186.      m_treepages[1]->ShowWindow(SW_SHOW);
  187.      m_treepages[0]->ShowWindow(SW_HIDE);
  188.      m_treepages[2]->ShowWindow(SW_HIDE);
  189.     }
  190.     else if (curtext=="child2")
  191.          {
  192.              m_treepages[0]->ShowWindow(SW_SHOW);
  193.              m_treepages[1]->ShowWindow(SW_HIDE);
  194.              m_treepages[2]->ShowWindow(SW_HIDE);
  195.          }
  196.      else if (curtext=="child3")
  197.              {
  198.              m_treepages[0]->ShowWindow(SW_HIDE);
  199.              m_treepages[1]->ShowWindow(SW_HIDE);
  200.              m_treepages[2]->ShowWindow(SW_SHOW);
  201.              }
  202.              else
  203.          {
  204.          m_treepages[0]->ShowWindow(SW_HIDE);
  205.          m_treepages[1]->ShowWindow(SW_HIDE);
  206.          m_treepages[2]->ShowWindow(SW_HIDE);
  207.          }
  208.      UpdateData(false);
  209.     *pResult = 0;
  210. }


  211. void CtreeDlg::OnBeginlabeleditTree(NMHDR *pNMHDR, LRESULT *pResult)
  212. {
  213.     LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
  214.     // TODO: 在此添加控件通知处理程序代码
  215.     
  216.     if(pTVDispInfo->item.lParam == 0)
  217.      {
  218.          *pResult = 1;//取消编辑
  219.     }
  220.     else
  221.         *pResult = 0;

  222. }


  223. void CtreeDlg::OnEndlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult)
  224. {
  225.     LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
  226.     // TODO: 在此添加控件通知处理程序代码
  227.     *pResult = 0;
  228.     if (pTVDispInfo->item.pszText != NULL)
  229.     {
  230.         m_tree.SetItemText(pTVDispInfo->item.hItem,pTVDispInfo->item.pszText);
  231.     }
  232. }


  233. void CtreeDlg::OnGetInfoTipTree(NMHDR *pNMHDR, LRESULT *pResult)
  234. {
  235.     LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMTVGETINFOTIP>(pNMHDR);
  236.     // TODO: 在此添加控件通知处理程序代码
  237.     *pResult = 0;
  238.     
  239.     HTREEITEM hRoot = m_tree.GetRootItem(); // 获取树的根节点
  240.     CString strText; // 每个树节点的提示信息
  241.     if (pGetInfoTip->hItem ==hRoot)
  242.     {
  243.         // 如果鼠标划过的节点是根节点,则提示信息为空
  244.         strText = _T("根节点");
  245.     }
  246.     else
  247.     {
  248.         // 如果鼠标划过的节点不是根节点,则将该节点的附加32位数据格式化为字符串
  249.         strText.Format(_T("它的节点号为: %d"),pGetInfoTip->lParam);
  250.     }

  251.     // 将strText字符串拷贝到pTVTipInfo结构体变量的pszText成员中,这样就能显示内容为strText的提示信息
  252.      wcscpy(pGetInfoTip->pszText, strText);
  253. }
显示结果如图:



 


阅读(2351) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~