2024年4月12日发(作者:)

树控件(TREECTRL)的使用

通过“FILE->NEW->PROJECTS->MFC AppWizard(EXE)”建立名为VCTREE的工

程,在建立过程中选择基于对话框(Dialog based)的应用;将对话框中的默认

控件删除,并将所有对话框属性中的Language域设置为Chinese(P.R.C.),以使

应用程序支持中文;建立两个图标IDI_PM和IDI_CJ,用来表示图标的选中和非

选中状态,对于每个图标都应建立32X32和16X16两种大小,以保证程序的需要;

在对话框窗口中添加树控制对象(TREE CONTROL),并设置五个按钮“增

加|删除|查看|排序|关闭”,其对应标识分别如下:

控制名称 标题名

称 标识符号

树控

IDC_TREECTRL

钮 增 加

IDC_ADD

删 除

IDC_DEL

查 看

IDC_VIEW

排 序

IDC_SORT

关 闭

IDOK

选中树控制控件,选择“VIEW->ClassWizard->Memory Variables。

IDC_TREECTRL 引入成员变量,其变量类型为:

变量名 种

类 变量类型

m_TreeCtrl Control C

TreeCtrl

同时利用“MESSAGES MAP”为各命令按钮增加控制功能函数。

然后在代码文件中分别加入如下控制代码:

(1)在文件开始处增加图像列表定义

CImageList Cil1,Cil2;//大小图标像列表

(2)在初始化文件开始处增加代码

BOOL CVCTREEDlg::OnInitDialog()

{ CDialog::OnInitDialog();

......//原来其它代码

// TODO: Add extra initialization here

// 此处开始增加代码

(16,16,ILC_COLOR,2,2);

(AfxGetApp()->LoadIcon(IDI_PM));

(AfxGetApp()->LoadIcon(IDI_CJ));

m_geList(&Cil1,TVSIL_NORMAL); file://设置图

象列表

DWORD

dwStyles=GetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE);//获取树控制原风

dwStyles|=TVS_EDITLABELS|TVS_HASBUTTONS|TVS_HASLINES|TVS_L

INESATROOT;

SetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE,dwStyles);//设置

风格

wchar_t * CJ[4]={L"玉溪卷烟厂",L"云南卷烟厂",L"沈阳卷烟厂",L"

成都卷烟厂"};//根数据名称

wchar_t * PM[4][5]={

{L"红梅一",L"红梅二",L"红梅三",L"红梅四",L"红梅五"},//产品数据

{L"白梅一",L"白梅二",L"白梅三",L"白梅四",L"白梅五"},

{L"绿梅一",L"绿梅二",L"绿梅三",L"绿梅四",L"绿梅五"},

{L"青梅一",L"青梅二",L"青梅三",L"青梅四",L"青梅五"}};

int i,j;

HTREEITEM hRoot,hCur;//树控制项目句柄

TV_INSERTSTRUCT TCItem;//插入数据项数据结构

t=TVI_ROOT;//增加根项

tAfter=TVI_LAST;//在最后项之后

=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELE

CTEDIMAGE;//设屏蔽

t="数据选择";

=0;//序号

=0;//正常图标

tedImage=1;//选中时图标

hRoot=m_Item(&TCItem);//返回根项句柄

for(i=0;i<4;i++){//增加各厂家

t=hRoot;

t=CJ[i];

=(i+1)*10;//子项序号

hCur=m_Item(&TCItem);

for(j=0;j<5;j++){//增加各产品

t=hCur;

t=PM[i][j];

=(i+1)*10+(j+1);//子项序号

m_Item(&TCItem);

}

m_(hCur,TVE_EXPAND);//展开树

}

m_(hRoot,TVE_EXPAND);//展开上一级树

return TRUE; // return TRUE unless you set the

focus to a control

}

(3)增加树项功能的实现

在增加树项功能时,除了需要定义和设置插入树项的数据结构之外,

还需要注意的是新增树项的名称初始时均为“新增数据”,增加后允许用户给数

据项设置自定义名称。在编程时应特别注意m_bel(hInsert);

后面不能跟任何其它程序命令,否则这条编辑指令无效。

void CVCTREEDlg::OnAdd()

{ file://增加子项功能函数

HTREEITEM hSel=m_ectedItem();//取得选择项句柄

if(hSel==NULL) return;//无任何选项则返回

static int nAddNo=100;//编号大于100为新增数据

TV_INSERTSTRUCT TCItem;//定义插入项数据结构

t=hSel; file://设置父项句柄

tAfter=TVI_LAST;//在最后增加

=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELE

CTEDIMAGE;//设屏蔽

t="新增数据";

=nAddNo++;//索引号增加

=0;//正常图标

tedImage=1;//选中时图标

HTREEITEM hInsert=m_Item(&TCItem);//增加

m_(hSel,TVE_EXPAND);

m_bel(hInsert);//修改增加的数据

}

(4)删除树项功能的实现

在实现删除功能时,应对存在子项的树项进行提示,以警告用户是

否连同其子项一起删除。

void CVCTREEDlg::OnDel()

{ //删除子项功能函数

HTREEITEM hSel=m_ectedItem();//取得选项

句柄;

if(hSel==NULL) return;//无任何选项则返回

if(m_sChildren(hSel))//判断是否有子项

if(MessageBox("厂家下存在品名,一同删除?","警告

",MB_YESNO)==IDNO) return;

m_Item(hSel);

}

(5)排序功能的实现

排序功能是对所选中的树项的所有子项按字符中顺序进行排序,如

果想要按照其它规则进行排序,应利用SortChildrenItemBC()函数进行自行开

发排序程序,这个自行开发的函数与列表控制中实现的函数基本相同,可兴趣的

读可以试验。

void CVCTREEDlg::OnSort()

{ //排序子项功能函数

HTREEITEM hSel=m_ectedItem();//取得选项句

柄;

if(hSel==NULL) return;//无任何选项则返回

m_ildren(hSel);

}

(6)查看功能的实现

查看功能用来查看选中树项的有关信息,函数中中显示了树项的文

本名称和标识号,可以将这两个信息作为查找关键字,来查看其它更详细的信息。

void CVCTREEDlg::OnView()

{ //查看选中项功能函数

HTREEITEM hSel=m_ectedItem();//取得选项句

柄;

if(hSel==NULL) return;//无任何选项则返回

CString cText=m_mText(hSel);//取得数据项名

LONG IDs=m_mData(hSel);//取得数据项序号

char temp[100];

wsprintf(temp,"厂家:%s 编号:%05d",cText,IDs);

MessageBox(temp,"选择信息");

}

(7)修改功能的实现

如果不进行其它处理,当修改树项的文本名称后,就会发现其未被

修改,这是因为程序中没有对修改结果进行保存处理,这就要利用TV_DISPINFO

结构和SetItemText函数对TVN_ENDLABELEDIT进行处理,这样就可以正确地实

现修改功能。

void CVCTREEDlg::OnEndlabeleditTree(NMHDR* pNMHDR, LRESULT* pResult)

{ TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;

// TODO: Add your control notification handler code here

if(pTVDispInfo->t==0) return;//用户取消修改

操作

m_mText(pTVDispInfo->,

pTVDispInfo->t);//设置新数据

*pResult = 0;

}