;运行效果
;win32汇编环境,对话框中使用树形视图示例三
;给树形视图控件treeview每项加上选中时和未选中时显示的图标
;图标可以自已弄2个,规格是32*32,位深度是32,1个用来显示选中项时显示,1个用来显示未选中项时显示
;直接抄进RadAsm可编译运行。重要部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
include windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc ;加上所需头文件
includelib user32.lib
includelib kernel32.lib
includelib comctl32.lib ;加上所需库文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自定义函数声明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
.data
DlgName db "MyDialog",0
szMsg db "提示",0
szFuHao01 db "\",0
szFrm db "%d",0
szShow1 db "魏国",0
szShow11 db "武将",0
szShow111 db "张辽",0
szShow112 db "曹仁",0
szShow113 db "夏侯渊",0
szShow12 db "文臣",0
szShow121 db "荀彧",0
szShow122 db "司马懿",0
szShow123 db "郭嘉",0
szShow2 db "蜀国",0
szShow3 db "吴国",0
.data?
hInstance HINSTANCE ?
h_Trv01 dd ? ;树形视图控件句柄
h_IconList01 dd ? ;图像列表控件句柄
h_icon01 dd ?
h_icon02 dd ?
.const
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义
ICO_MAIN equ 1000 ;图标
ICO_MAIN01 equ 1001
ICO_MAIN02 equ 1002
IDC_TRV1 equ 2001 ;树形视图控件标识符
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke InitCommonControls ;这句要加上
invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL
invoke ExitProcess,eax
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL @tvs01:TV_INSERTSTRUCT ;根项的结构
LOCAL @h01:HTREEITEM ;根项的句柄
LOCAL @tvs011:TV_INSERTSTRUCT
LOCAL @h011:HTREEITEM
LOCAL @tvs0111:TV_INSERTSTRUCT
LOCAL @tvs0112:TV_INSERTSTRUCT
LOCAL @tvs0113:TV_INSERTSTRUCT
LOCAL @tvs012:TV_INSERTSTRUCT
LOCAL @h012:HTREEITEM
LOCAL @tvs0121:TV_INSERTSTRUCT
LOCAL @tvs0122:TV_INSERTSTRUCT
LOCAL @tvs0123:TV_INSERTSTRUCT
LOCAL @tvs02:TV_INSERTSTRUCT
LOCAL @tvs03:TV_INSERTSTRUCT
LOCAL @GetTvs:TVITEM ;定义一个要保存的当前选定项的 TVITEM 结构
LOCAL @szBuffer[256]:byte
LOCAL @szCurrentBuffer[256]:byte ;当前项字符串用的数组
LOCAL @szPareBuffer[256]:byte ;父项字符串用的数组
LOCAL @szAllBuffer[256]:byte ;要显示全部路径字符串的数组
LOCAL @Cheshi[256]:byte ;中转用字符串数组
LOCAL @hCurrent ;当前选定项的句柄
LOCAL @hPare ;父项的句柄
.if uMsg == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
;开始前需要给控件绑定图像列表,即使不显示图像,只显示文本
invoke ImageList_Create,24,24,ILC_MASK + ILC_COLORDDB,0,0 ;创建图像列表,24是图标的像素24*24,这个像素的大小决定了每个项的大小,ILC_MASK是让图像四周的多余部分透明化,ILC_COLORDDB是尽量保留原图清晰度
mov h_IconList01,eax ;保存图像列表句柄留后面用
invoke LoadIcon,hInstance,ICO_MAIN01 ;加载来自文件的图标
invoke ImageList_AddIcon,h_IconList01,eax ;给图像列表增加图标
mov h_icon01,eax ;保存图标在列表中的索引值
invoke LoadIcon,hInstance,ICO_MAIN02
invoke ImageList_AddIcon,h_IconList01,eax
mov h_icon02,eax
invoke GetDlgItem,hWnd,IDC_TRV1
mov h_Trv01,eax
invoke SendMessage,h_Trv01,TVM_SETIMAGELIST,TVSIL_NORMAL,h_IconList01 ;给树形视图控件绑上图像列表,就是选中和不选中时的图标样式
mov @tvs01.hParent,TVI_ROOT ;添加"魏国"字样,TVI_ROOT是指其为根项
mov @tvs01.item._mask,TVIF_TEXT+TVIF_SELECTEDIMAGE+TVIF_IMAGE ;将item的TVIF_TEXT,TVIF_SELECTEDIMAGE,TVIF_SELECTEDIMAGE值设好,即说明这个项是使用文本显示,加选中时图标,不选中时图标
lea eax,offset szShow1 ;把字符串szShow1的地址给eax
mov @tvs01.item.pszText,eax ;eax是前面的字符串地址
mov @tvs01.item.iImage,0 ;0是图像列表索引值,就是图像列表的第1个图标,即选中时的图标
mov @tvs01.item.iSelectedImage,1 ;1是图像列表索引值,即不选中时的图标
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs01 ;发送TVM_INSERTITEM消息添加这一项,其返回值就是这一项的句柄
mov @h01,eax ;保存句柄,后面跟在它身后的子项,需使用这个作为父项句柄
mov ebx,@h01 ;开始添加"武将"字样
mov @tvs011.hParent,ebx ;hParent的意思是指定父项的句柄,就是说后面点击展开的是子项,它需要前面的父项的句柄
mov @tvs011.item._mask,TVIF_TEXT+TVIF_SELECTEDIMAGE+TVIF_IMAGE
lea eax,offset szShow11
mov @tvs011.item.pszText,eax
mov @tvs011.item.iImage,0
mov @tvs011.item.iSelectedImage,1
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs011
mov @h011,eax
mov ebx,@h011 ;开始添加"张辽"字样
mov @tvs0111.hParent,ebx
mov @tvs0111.item._mask,TVIF_TEXT+TVIF_SELECTEDIMAGE+TVIF_IMAGE
lea eax,offset szShow111
mov @tvs0111.item.pszText,eax
mov @tvs0111.item.iImage,0
mov @tvs0111.item.iSelectedImage,1
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs0111
mov ebx,@h011 ;开始添加"曹仁"字样
mov @tvs0112.hParent,ebx
mov @tvs0112.item._mask,TVIF_TEXT+TVIF_SELECTEDIMAGE+TVIF_IMAGE
lea eax,offset szShow112
mov @tvs0112.item.pszText,eax
mov @tvs0112.item.iImage,0
mov @tvs0112.item.iSelectedImage,1
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs0112
mov ebx,@h011 ;开始添加"夏侯渊"字样
mov @tvs0113.hParent,ebx
mov @tvs0113.item._mask,TVIF_TEXT+TVIF_SELECTEDIMAGE+TVIF_IMAGE
lea eax,offset szShow113
mov @tvs0113.item.pszText,eax
mov @tvs0113.item.iImage,0
mov @tvs0113.item.iSelectedImage,1
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs0113
mov ebx,@h01 ;开始添加"文臣"字样
mov @tvs012.hParent,ebx
mov @tvs012.item._mask,TVIF_TEXT+TVIF_SELECTEDIMAGE+TVIF_IMAGE
lea eax,offset szShow12
mov @tvs012.item.pszText,eax
mov @tvs012.item.iImage,0
mov @tvs012.item.iSelectedImage,1
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs012
mov @h012,eax
mov ebx,@h012 ;开始添加"荀彧"字样
mov @tvs0121.hParent,ebx
mov @tvs0121.item._mask,TVIF_TEXT+TVIF_SELECTEDIMAGE+TVIF_IMAGE
lea eax,offset szShow121
mov @tvs0121.item.pszText,eax
mov @tvs0121.item.iImage,0
mov @tvs0121.item.iSelectedImage,1
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs0121
mov ebx,@h012 ;开始添加"司马懿"字样
mov @tvs0122.hParent,ebx
mov @tvs0122.item._mask,TVIF_TEXT+TVIF_SELECTEDIMAGE+TVIF_IMAGE
lea eax,offset szShow122
mov @tvs0122.item.pszText,eax
mov @tvs0122.item.iImage,0
mov @tvs0122.item.iSelectedImage,1
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs0122
mov ebx,@h012 ;开始添加"郭嘉"字样
mov @tvs0123.hParent,ebx
mov @tvs0123.item._mask,TVIF_TEXT+TVIF_SELECTEDIMAGE+TVIF_IMAGE
lea eax,offset szShow123
mov @tvs0123.item.pszText,eax
mov @tvs0123.item.iImage,0
mov @tvs0123.item.iSelectedImage,1
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs0123
mov @tvs02.hParent,TVI_ROOT ;开始添加"蜀国"字样
mov @tvs02.item._mask,TVIF_TEXT+TVIF_SELECTEDIMAGE+TVIF_IMAGE
lea eax,offset szShow2
mov @tvs02.item.pszText,eax
mov @tvs02.item.iImage,0
mov @tvs02.item.iSelectedImage,1
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs02
mov @tvs03.hParent,TVI_ROOT ;开始添加"吴国"字样
mov @tvs03.item._mask,TVIF_TEXT+TVIF_SELECTEDIMAGE+TVIF_IMAGE
lea eax,offset szShow3
mov @tvs03.item.pszText,eax
mov @tvs03.item.iImage,0
mov @tvs03.item.iSelectedImage,1
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs03
.elseif uMsg == WM_CLOSE
invoke ImageList_Destroy,h_IconList01 ;程序退出前销毁图像列表
invoke EndDialog, hWnd,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
;下面为rc文件内容
#include "resource.h" //提示缺少该文件,可以在资源里下载
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN 1000 //图标
#define ICO_MAIN01 1001 //图标
#define ICO_MAIN02 1002 //图标
#define IDC_TRV1 2001
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico"
ICO_MAIN01 ICON "01.ico"
ICO_MAIN02 ICON "02.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义对话框
MyDialog DIALOG 10, 10, 135, 200
STYLE DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "对话框程序模版"
FONT 12, "方正姚体"
BEGIN
CONTROL "树形视图控件示例三:", -1, "Static", WS_CHILD | WS_VISIBLE, 5, 5, 100, 20
CONTROL "",IDC_TRV1,"SysTreeView32",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP|TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS,7,20,120,170,WS_EX_CLIENTEDGE
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>