在MFC中应用CTreeCtrl控件的技巧

关键词: VC,    CTreeCtrl,    控件                                          

转自http://www.vckbase.com/document/viewdoc/?id=1637

  首先,我们要创建一个基本对话框的MFC工程MFC_TreeCRTL(名字随便给一个)。然后在资源视图中插入两个Dialog,ID分别为IDD_DIALOG11和IDD_DIALOG211,都更改Style属性为Child,Border属性为None,为它们建立两个类,分别命名为Cdialog11和Cdialog211,并在MFC_TreeCRTLDlg.CPP文件中包含dialog11.h和dialog211.h两个头文件。再导入几个资源图标作为树形控件节点的图标及装饰面板。最后在主面板上添加一个CTreeCtrl控件,ID为默认,并在ClassWizard中添加它的一个变量,命名为m_mytree。

接着,我们进行具体代码编写。

我们必须在CMFC_TreeCRTLDlg类中加入这些变量和函数

 CDialog * m_treePages[2];

 CString node_name;

 BOOL InitMytree();

我们还要在CMFC_TreeCRTLDlg类的构造函数中为m_treePages[2]分配空间,

 m_treePages[0]=new Cdialog11;

 m_treePages[1]=new Cdialog211;

InitMytree()函数为m_mytree的初始化过程

BOOL CMFC_TreeCRTLDlg::InitMytree()

{

 //节点的图标 

 int i=0;

 int i_count=2;

 //载入图标

 HICON icon[4];

 icon[0]=AfxGetApp()->LoadIcon (IDI_ICON6);

 icon[1]=AfxGetApp()->LoadIcon (IDI_ICON7);

 //创建图像列表控件

 CImageList *m_imagelist=new CImageList;

 m_imagelist->Create(16,16,0,7,7);

 m_imagelist->SetBkColor (RGB(255,255,255));

 for(int n=0;n<i_count;n++)

 {

 m_imagelist->Add(icon[n]);  //把图标载入图像列表控件

 }

 m_mytree.SetImageList(m_imagelist,TVSIL_NORMAL);  //为m_mytree设置一个图像列表,使CtreeCtrl的节点显示不同的图标

 m_mytree.SetBkColor(RGB(0,250,255));//设置m_mytree的背景色

 //创建节点

 //父节点

 HTREEITEM root0=m_mytree.InsertItem("Dialog1",0,1,TVI_ROOT,TVI_LAST);

 HTREEITEM root1=m_mytree.InsertItem("Dialog2",0,1,TVI_ROOT,TVI_LAST);

 //一层子节点

 HTREEITEM sub_son0=m_mytree.InsertItem("Dialog 1-1",0,1,root0,TVI_LAST);

 HTREEITEM sub_son1=m_mytree.InsertItem("Dialog 2-1",0,1,root1,TVI_LAST);

 //二层孙子节点

 HTREEITEM sub_m_son0=m_mytree.InsertItem("Dialog 2-1-1",0,1,sub_son1,TVI_LAST);

 //建立节点对应的Dialog

 m_treePages[0]->Create(IDD_DIALOG11,this);

 m_treePages[1]->Create(IDD_DIALOG211,this);

 m_treePages[0]->ShowWindow(SW_SHOW);

 m_treePages[1]->ShowWindow(SW_HIDE);

 //把Dialog移到合适位置

 CRect m_rect;

 GetClientRect(m_rect);

 m_rect.left=200;

 m_treePages[0]->MoveWindow(m_rect);

 m_treePages[1]->MoveWindow(m_rect);

 

 return true;

}

  始初化完成后,我们要添加CTreeCtrl的消息响应事件,这样才能让它按我们的要求起作用。我们打开Class Wizard点选IDC_TREE1添加TVN_SELCHANGED消息,并在消息响应函数中写入代码。

void CMFC_TreeCRTLDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)

{

 NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

 // TODO: Add your control notification handler code here

 

 UpdateData(true);

 node_name=m_mytree.GetItemText(pNMTreeView->itemNew.hItem);

 //在标题栏显示节点信息

 SetWindowText(node_name);

 //切换面板

 if(node_name=="Dialog 1-1"){

  m_treePages[0]->ShowWindow(SW_SHOW);

  m_treePages[1]->ShowWindow(SW_HIDE);

 }

 else if(node_name=="Dialog 2-1-1"){

  m_treePages[0]->ShowWindow(SW_HIDE);

  m_treePages[1]->ShowWindow(SW_SHOW);

 }

 UpdateData(false);

 *pResult = 0;

}

最后,我们在 CMFC_TreeCRTLDlg::OnInitDialog()初始化函数里调用InitMytree()函数。程序运行效果:

****************************

树视控件在多文档中的使用

关键词: VC,    CTreeCtrl                                          

转自http://www.vckbase.com/document/viewdoc/?id=953

树视控件在多文档中的使用

作者 5icomputer

    自从来到我们的论坛以来,认识了很多的朋友和编程的高手,从中学到了很多知识。我看在论坛中有很多人问关于树控的问题。故将树控的一些问题写出来,以供大家参考,同时也作为近一段时间来学习的总结。

    本文中主要讲到如何在多文档中加入一个ControlBar,以及如何在ControlBar中加入一个树控方法。这也是软件系统中常用的一种界面,希望能对大家有所帮助。

本例的运行结果如下:

 

    首先,新建一个多文档工程,将Sizecbar.cpp和Sizecbar.h复制到工程的文件加中,并将新文件加入到工程中。这样工程中加入了个新类CsizingControlBar。然后,利用Class Wizard 生成也基于CtoolBar的新类mybar。将基类改为CsizingControlBar。

在mybar类中加入OnUpdateCmdUI(CFrameWnd *pTarget, BOOL bDisableIfNoHndler)

代码如下:

void mybar::OnUpdateCmdUI(CFrameWnd *pTarget, BOOL bDisableIfNoHndler)

{

 UpdateDialogControls(pTarget, bDisableIfNoHndler);

}

再在CMainFrame中加入mybar 的成员变量m_CtrlBar; 在CmainFrame的OnCreate函数中加入一下代码:

if(!m_CtrlBar.Create("数据浏览条",this, CSize(200,200),TRUE,123))

{

 TRACE0("Failed to create mybar\n");

 return -1;

 // fail to create

}

m_CtrlBar.SetBarStyle(m_CtrlBar.GetBarStyle()|

 CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

m_CtrlBar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_CtrlBar,AFX_IDW_DOCKBAR_LEFT);

此时运行一下程序,将看到已经将mybar加入了工程中。 下面将在mybar中加入一个树视控件。

新建个类MyTree 基于CTreeCtrl。再在mybar加入成员变量 MyTree m_TreeCtrl;

将mybar重载WM_CREATE消息函数。在其中加入如下代码。

m_TreeCtrl.Create(WS_VISIBLE | WS_TABSTOP | WS_CHILD | WS_BORDER

  | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES

  | TVS_DISABLEDRAGDROP|TVS_EDITLABELS|TVS_TRACKSELECT,

  CRect(10, 10, 300, 100), this, ID_TREECTRL);

 

 // m_TreeCtrl.SetImageList(&m_images,TVSIL_NORMAL);

 // set "normal" GUI-font

 CFont *font = CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT));

 m_TreeCtrl.SetFont(font);

 

 HTREEITEM root = m_TreeCtrl.InsertItem("VCKBASE",0,0);

 HTREEITEM subroot1=m_TreeCtrl.InsertItem("程序员社区",1,1,root);

 HTREEITEM subroot2=m_TreeCtrl.InsertItem("文档中心",1,1,root);

 HTREEITEM subroot3=m_TreeCtrl.InsertItem("代码仓库",1,1,root);

 HTREEITEM subroot4=m_TreeCtrl.InsertItem("工具和资源",1,1,root);

 HTREEITEM subroot5=m_TreeCtrl.InsertItem("客服中心",1,1,root);

 HTREEITEM subroot6=m_TreeCtrl.InsertItem("个人专栏",1,1,root);

 m_TreeCtrl.InsertItem("开发论坛",1,1,subroot1);

 m_TreeCtrl.InsertItem("开发联盟",1,1,subroot1);

 m_TreeCtrl.InsertItem("人才交流",1,1,subroot1);

 m_TreeCtrl.InsertItem("用户注册",1,1,subroot1);

 m_TreeCtrl.InsertItem("VCity",1,1,subroot1);

 

 m_TreeCtrl.InsertItem("在线杂志",1,1,subroot2);

 m_TreeCtrl.InsertItem("个人专辑",1,1,subroot2);

 m_TreeCtrl.InsertItem("论坛精华",1,1,subroot2);

 m_TreeCtrl.InsertItem("酷库",1,1,subroot2);

 m_TreeCtrl.InsertItem("所有文章",1,1,subroot2);

 m_TreeCtrl.InsertItem("所有代码",1,1,subroot3);

 

 m_TreeCtrl.InsertItem("程序工具箱",1,1,subroot4);

 m_TreeCtrl.InsertItem("程序工具箱",1,1,subroot5);

 m_TreeCtrl.InsertItem("用户注册",1,1,subroot5);

 m_TreeCtrl.InsertItem("修改信息",1,1,subroot5);

 m_TreeCtrl.InsertItem("取回密码",1,1,subroot5);

 m_TreeCtrl.InsertItem("问题解答",1,1,subroot5);

 m_TreeCtrl.InsertItem("投稿",1,1,subroot5);

 m_TreeCtrl.InsertItem("联系我们",1,1,subroot5);

 

 m_TreeCtrl.SelectItem(root);//展开接点

 m_TreeCtrl.Expand(root, TVE_EXPAND);

在重载mybar的WM_SIZE消息函数,并在其中加入如下代码:

CRect rc;

 GetClientRect(&rc);

 m_TreeCtrl.MoveWindow(&rc);

在CCTreeControlBarView中,添加成员变量m_Title,添加成员函数DrawRect(CDC *pDC);

代码如下:

void CCTreeControlBarView::DrawRect(CDC* pDC)

{

 CRect rect;

 pDC->Rectangle(100,100,400,400);

 rect.top=100;

 rect.left=100;

 rect.right=250;

 rect.bottom=250;

 pDC->DrawText(m_Title,rect,DT_CENTER);

}

在OnDraw函数中调用此函数;

再在应用程序类中加入视图类的指针,pView; 在视图中重载OnInitUpdate()函数,其中对pView进行初始化。代码如下

void CCTreeControlBarView::OnInitialUpdate()

{

 CView::OnInitialUpdate();

 // TODO: Add your specialized code here and/or call the base class

 CCTreeControlBarApp *pApp=(CCTreeControlBarApp *)AfxGetApp();

 pApp->pView=this;

}

在MyTree类中添加左键单击函数OnLButtonDown()在函数中将通过单击树控中的节点,获得对应节点的文本标题。代码如下:

HTREEITEM hItem =HitTest(point, &m_uFlags);

//进行的是与运算,对于 二进制数来说都为1的情况下结果为1

if ( (m_uFlags&TVHT_ONITEMLABEL ))

{

 

 CCTreeControlBarApp *pApp=(CCTreeControlBarApp *)AfxGetApp();

 pApp->pView->m_Title=GetItemText(hItem);;

 pApp->pView->Invalidate(TRUE);

 SelectItem(hItem);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值