;运行效果,当点击张辽时,展示张辽的图像
;当点击曹仁时,展示曹仁的图像
;win32汇编环境,对话框中使用树形视图示例四
;当点击树形视图treeview控件中的某项时,展示某些功能。这里展示的是当点到某个将领时,显示某个将领的图像
;直接抄进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 ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义
ICO_MAIN equ 1000 ;图标
IDC_TRV1 equ 1001 ;树形视图控件标识符
DLG_MAIN equ 1
IDB_1 equ 11
IDB_2 equ 12
IDC_BMP equ 108
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
.data
DlgName db "MyDialog",0
szMsg db "提示",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 ?
hBmp1 dd ? ;准备显示的图像句柄
hBmp2 dd ?
.const
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset 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
.if uMsg == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
;开始前需要给控件绑定图像列表,即使不显示图像,只显示文本
invoke ImageList_Create,32,32,ILC_MASK + ILC_COLORDDB,0,0 ;创建图像列表,32是图标的像素32*32,ILC_MASK是让图像四周的多余部分透明化,ILC_COLORDDB是尽量保留原图清晰度
mov h_IconList01,eax ;保存句柄留后面用
invoke LoadIcon,NULL,IDI_APPLICATION ;得到默认应用程序图标的句柄
invoke ImageList_AddIcon,h_IconList01,eax ;eax是上面得到的句柄,本函数让这个图标添加入图像列表里面
mov h_icon01,eax ;保存图标在列表中的索引值
invoke GetDlgItem,hWnd,IDC_TRV1
mov h_Trv01,eax
invoke SendMessage,h_Trv01,TVM_SETIMAGELIST,TVSIL_NORMAL,0 ;给树形视图控件绑上图像列表
mov @tvs01.hParent,TVI_ROOT ;添加"魏国"字样,TVI_ROOT是指其为根项
mov @tvs01.item._mask,TVIF_TEXT ;将item的TVIF_TEXT值设好,即说明这个项是使用文本显示的
lea eax,offset szShow1 ;把字符串szShow1的地址给eax
mov @tvs01.item.pszText,eax ;eax是前面的字符串地址
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
lea eax,offset szShow11
mov @tvs011.item.pszText,eax
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
lea eax,offset szShow111
mov @tvs0111.item.pszText,eax
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs0111
mov ebx,@h011 ;开始添加"曹仁"字样
mov @tvs0112.hParent,ebx
mov @tvs0112.item._mask,TVIF_TEXT
lea eax,offset szShow112
mov @tvs0112.item.pszText,eax
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs0112
mov ebx,@h011 ;开始添加"夏侯渊"字样
mov @tvs0113.hParent,ebx
mov @tvs0113.item._mask,TVIF_TEXT
lea eax,offset szShow113
mov @tvs0113.item.pszText,eax
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs0113
mov ebx,@h01 ;开始添加"文臣"字样
mov @tvs012.hParent,ebx
mov @tvs012.item._mask,TVIF_TEXT
lea eax,offset szShow12
mov @tvs012.item.pszText,eax
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
lea eax,offset szShow121
mov @tvs0121.item.pszText,eax
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs0121
mov ebx,@h012 ;开始添加"司马懿"字样
mov @tvs0122.hParent,ebx
mov @tvs0122.item._mask,TVIF_TEXT
lea eax,offset szShow122
mov @tvs0122.item.pszText,eax
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs0122
mov ebx,@h012 ;开始添加"郭嘉"字样
mov @tvs0123.hParent,ebx
mov @tvs0123.item._mask,TVIF_TEXT
lea eax,offset szShow123
mov @tvs0123.item.pszText,eax
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs0123
mov @tvs02.hParent,TVI_ROOT ;开始添加"蜀国"字样
mov @tvs02.item._mask,TVIF_TEXT
lea eax,offset szShow2
mov @tvs02.item.pszText,eax
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs02
mov @tvs03.hParent,TVI_ROOT ;开始添加"吴国"字样
mov @tvs03.item._mask,TVIF_TEXT
lea eax,offset szShow3
mov @tvs03.item.pszText,eax
invoke SendMessage,h_Trv01,TVM_INSERTITEM,0,addr @tvs03
invoke LoadBitmap,hInstance,IDB_1 ;得到图像张辽的句柄
mov hBmp1,eax
invoke LoadBitmap,hInstance,IDB_2
mov hBmp2,eax
.elseif uMsg == WM_NOTIFY ;WM_NOTIFY消息为扩展后的控件消息,早期的WINDOWS没那么多功能,后来版本升级了,有更多的功能了,这些功能就在WM_NOTIFY消息里
.if wParam == IDC_TRV1 ;如果是树形视图的消息,则
mov ebx,lParam ;lParam指向消息结构,即当你点击状态栏时,系统把这个消息放在一个结构里,但只能把指向这个结构的指针发送过来,就是lParam
.if [ebx + NMHDR.code] == TVN_SELCHANGED ;取得lParam指针所指向的结构中的NMHDR结构的成员 code 的值,TVN_SELCHANGED是即将从一个项目更改为另一个项目的通知码,即当点某个项时发生
invoke RtlZeroMemory,addr @GetTvs,sizeof @GetTvs ;清空结构变量@GetTvs
invoke RtlZeroMemory,addr @szCurrentBuffer,sizeof @szCurrentBuffer ;清空字符数组空间@szCurrentBuffer
invoke SendMessage,h_Trv01,TVM_GETNEXTITEM,TVGN_CARET,0
mov @GetTvs.hItem,eax ;将句柄赋值给要保存的 @GetTvs 变量的 hItem
mov @GetTvs._mask,TVIF_TEXT ;指定掩码成员为 TVIF_TEXT ,就是要取得其字符串的意思
lea eax,@szCurrentBuffer ;把空的字符串数组地址给eax
mov @GetTvs.pszText,eax ;让 @GetTvs 变量的 pszText 成员指向上面的字符串数组
mov @GetTvs.cchTextMax,256
invoke SendMessage,h_Trv01,TVM_GETITEM,0,addr @GetTvs ;发送 TVM_GETITEM 消息给控件,让它把所选项的数据填到变量 @GetTvs 里去
invoke lstrcmp,addr szShow111,addr @szCurrentBuffer ;如果得到的字符串是“张辽”,则显示张辽的图片
.if !eax
invoke SendDlgItemMessage,hWnd,IDC_BMP,STM_SETIMAGE,IMAGE_BITMAP,hBmp1
.endif
invoke lstrcmp,addr szShow112,addr @szCurrentBuffer ;如果得到的字符串是“曹仁”,则显示曹仁的图片
.if !eax
invoke SendDlgItemMessage,hWnd,IDC_BMP,STM_SETIMAGE,IMAGE_BITMAP,hBmp2
.endif
.endif
.endif
.elseif uMsg == WM_CLOSE
invoke EndDialog, hWnd,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN 1000 //图标
#define DLG_MAIN 1
#define IDC_TRV1 1001
#define IDC_BMP 108
#define IDB_1 11
#define IDB_2 12
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico"
IDB_1 BITMAP "01.bmp"
IDB_2 BITMAP "02.bmp"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN DIALOG 10, 10, 400, 200
STYLE DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "对话框程序模版"
FONT 12, "方正姚体"
{
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
CONTROL "", IDC_BMP, "Static", SS_BITMAP | WS_CHILD | WS_VISIBLE, 140, 10, 100, 150
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>