树状控件的应用(选择出阵武将)

类别:VC语言 点击:0 评论:0 推荐:

           树状控件的应用

                          何志丹

下面是树状控件的一些应用,由于是由于用于演示,所以结构并不合理.其效果如图所示..

步骤如下:

 

1,Insert -> new class,插入一个新类CMyCtrl,基类为CTreeCtrl.

 

2,利用类向导为CMyTree添加WM_PANIT的响应函数.

代码如下:

void CMyTree::OnPaint()

{

         CPaintDC dc(this);

         CWnd::DefWindowProc( WM_PAINT, (WPARAM)dc.GetSafeHdc(), 0 );

         HTREEITEM hItem = this->GetFirstVisibleItem();

         while(NULL != hItem)

         {

                   UINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;

                   if(GetItemState( hItem, selflag ) & selflag)

                   {

                            hItem = GetNextVisibleItem(hItem);

                            continue ;

                   }

                   CRect r;

                   GetItemRect(hItem,&r,true);

                   {//擦除旧内容                             

                            COLORREF col = dc.GetBkColor();

                            CBrush brush(col);

                            CPen   pen(PS_NULL,1,col);

                            CBrush * pOldBrush = dc.SelectObject(&brush);

                            CPen   * pOldPen   = dc.SelectObject(&pen);

                            dc.Rectangle(&r);

                            dc.SelectObject(pOldBrush);

                            dc.SelectObject(pOldPen);                 

                   }

                   CString strText = GetItemText(hItem);

                   //设置颜色

                   dc.SetBkColor( GetSysColor( COLOR_WINDOW ) );

                   dc.SetTextColor(RGB(255,0,0));

                   //更改字体

                   LOGFONT logfont ;

                   GetFont()->GetLogFont( &logfont );

                   logfont.lfItalic = true;

                   CFont font;

                   font.CreateFontIndirect(&logfont);

                   dc.SelectObject(&font);

                   dc.TextOut(r.left + 2,r.top + 1,strText);

                  

                   hItem = GetNextVisibleItem(hItem);

         }

}

 

3,建立一个基于对话框的程序,增加一个树状控件,ctrl + w打开类向导,为它增加一个关联变量m_tree_ctrl.

 

4,对树状控件右键,选取属性,把has buttons,has lines,lines at root都选上.

 

5,手动把CTreeCtrl        m_tree_ctrl;改成CMyTree     m_tree_ctrl;不要忘记了包含头文件,

#include "MyTree.h"

 

6,修改对话框的OnInitDialog

BOOL CTestTreeDlg::OnInitDialog()

{      

         …..

         HTREEITEM hRootItem = m_tree_ctrl.InsertItem("五虎上将!");

         m_tree_ctrl.InsertItem("关羽",hRootItem);

         m_tree_ctrl.InsertItem("张飞",hRootItem);

         m_tree_ctrl.InsertItem("赵云",hRootItem);

         m_tree_ctrl.InsertItem("马超",hRootItem);

         m_tree_ctrl.InsertItem("黄忠",hRootItem);

}

 

7,Ctrl + F5.效果如图.

 

8,在资源管理器中增加一个位图,ID为IDB_STATE.

 

9, 在CMyTree中增加成员变量CImageList m_Images;

 

10,修改CMyTree的PreSubclassWindow的响应函数.

 void CMyTree::PreSubclassWindow()

{

         SetBkColor(RGB(255,255,255));

        

         m_Images.Create (IDB_STATE, 18, 4, RGB (128, 0, 0));

         SetImageList (&m_Images, TVSIL_NORMAL);

         SetWindowLong(m_hWnd, GWL_STYLE, TVS_SHOWSELALWAYS|GetWindowLong(m_hWnd, GWL_STYLE));

        

         CTreeCtrl::PreSubclassWindow();

}

 

11,增CMyTree类=NM_CLICK的响应函数.

void CMyTree::OnClick(NMHDR* pNMHDR, LRESULT* pResult)

{

         DWORD dw = GetMessagePos();

         CPoint pt(LOWORD(dw),HIWORD(dw));//鼠标的屏幕坐标

         //转换为相对树控件的坐标

         CPoint pt1 = pt;

         CRect rect;

         GetClientRect(rect);

         ClientToScreen(&rect);

        

         pt1.x -= rect.left;

         pt1.y -= rect.top;

        

         //判断在树控件中的位置

         TVHITTESTINFO tHitTestInfo;

         tHitTestInfo.pt = pt1;

         HitTest(&tHitTestInfo);   

        

         if (TVHT_ONITEMICON == tHitTestInfo.flags)

         {

                   int nImage,nSelectImage ;

                   GetItemImage(tHitTestInfo.hItem,nImage,nSelectImage);

                   if(0 == nImage)

                            SetItemImage(tHitTestInfo.hItem,3,3);

                   else if(3 == nImage)

                            SetItemImage(tHitTestInfo.hItem,0,0);

         }

        

         *pResult = 0;

}

 

12,把对话框标题改为”请选择出阵的武将”.

 

13, BOOL CTestTreeDlg::OnInitDialog()

{      

         …..

         HTREEITEM hItem ;

         hItem = m_tree_ctrl.InsertItem("关羽");

         m_tree_ctrl.SetItemImage(hItem,1,1);

         m_tree_ctrl.InsertItem("张飞");

         m_tree_ctrl.InsertItem("赵云");

         m_tree_ctrl.InsertItem("马超");

         hItem = m_tree_ctrl.InsertItem("黄忠");

         m_tree_ctrl.SetItemImage(hItem,2,2);

}

 

14,把树状控件的has line取消掉.

 

15,再为对话框换一个好看的图标.

 

16,结果如最前面.

 

本文地址:http://com.8s8s.com/it/it1363.htm