首页 > 其他分享 >树状控件的应用(选择出阵武将)

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

时间:2022-10-05 11:34:29浏览次数:51  
标签:控件 ctrl InsertItem 树状 tree dc hItem 出阵


树状控件的应用

                          何志丹

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


步骤如下:


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,结果如最前面.


标签:控件,ctrl,InsertItem,树状,tree,dc,hItem,出阵
From: https://blog.51cto.com/u_15724537/5732456

相关文章

  • 关于 SAP UI5 所有控件的共同祖先 - sap.ui.base.ManagedObject
    ManagedObject的新子类是通过调用ManagedObject.extend创建的,并且可以使用本文介绍的以下托管功能。托管属性表示ManagedObject的状态。它们可以存储简单数据类型(如“......
  • SAP UI5 应用 SimpleForm 控件 ResponsiveGridLayout 布局的工作原理深入剖析试读版
    写作动机笔者在编写本步骤时,在网上搜索了一番,没有找到高质量的中文技术文章,能够讲清楚SAPUI5的屏幕尺寸检测机制。同时SAPUI5XML视图里很多带有S,M,L和XL后缀的控......
  • 【WPF】控件使用要点
    ContentPresenter:显示控件内容,默认显示内容属性,可以指定内容源头ContentSource=。具体用法如下:<ControlTemplateTargetType="{x:TypeHeaderedContentControl}">......
  • 树状数组+dfs
    P3605[USACO17JAN]PromotionCountingP-洛谷|计算机科学教育新生态(luogu.com.cn)这是一棵树,首先想到了dfs,但是数据范围大,所以不能单纯用dfs想到每个结点只跟他的......
  • 界面控件DevExpress WPF即将发布Windows 11深色主题,期待吗?
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专......
  • 数据绑定控件单选框
    应某人要求,简单写一下这里用DataList举个例子:如html代码如下:1<asp:DataListID="dlstClubTheme"runat="server"RepeatColumns="2"RepeatLayout="table">2......
  • Android 如何遍历容器(布局)下的所有控件(节点/组件)?
    通过上图可知,Android的页面是由多个ViewGroup和View构成,其中ViewGroup包含许多View和ViewGroup。View称之为“微件”,也可以说是组件、节点、控件。ViewGroup......
  • C#中使用BackgroundWorker控件
    在C#中,BackgroundWorker控件允许在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面(UI)似乎处于停止响应状态。如果需要能进行......
  • WPF 将控件放入到 UserControl 里获取 HwndSource 为空的情况
    本文记录将WPF控件放入到UserControl里,如果此UserControl没有被设置Visibility为可见过,那么放在此UserControl内的控件将获取不到HwndSource内容如果对某个V......
  • GTK常用控件之图片控件( GtkImage )
    图片控件和标签的作用很类似,都是作为显示用的,只是图片控件显示的内容是图片。图片控件的创建:GtkWidget*gtk_image_new_from_file(constgchar*filename);filename:图片的......