📄 treeview.asm
字号:
include .\head.inc
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
.const
IDR_BITMAP equ 101
.data
ClassName db "TreeViewClass",0
TreeViewClassName db "SYSTREEVIEW32",0
TitleName db "树形视图",0
ParentText db "Extension Libraries and Application Notes",0
ChildText1 db "Common Controls",0
ChildText2 db "Button List Boxes",0
GrandsonText1 db "Introduction",0
GrandsonText2 db "Style",0
GrandsonText3 db "Size and Position",0
GrandsonText4 db "Items",0
DragMode db 0
.data?
hInstance HINSTANCE ?
hTreeView HANDLE ?
hImageList HANDLE ?
hDragImageList HANDLE ?
hParent HANDLE ?
hChild HANDLE ?
nmhdr NMHDR <>
Rect RECT <>
temp db 80 dup (?)
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, NULL,NULL,NULL, SW_SHOWDEFAULT
invoke ExitProcess,eax
invoke InitCommonControls
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
mov eax, hInstance
mov wc.hInstance,eax
invoke GetStockObject,WHITE_BRUSH
mov wc.hbrBackground,eax
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_ASTERISK
mov wc.hIcon,eax
mov wc.hIconSm,0
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,WS_EX_CLIENTEDGE+WS_EX_APPWINDOW,addr ClassName,\
addr TitleName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,200,\
NULL,NULL,hInst,NULL
mov hwnd,eax
invoke ShowWindow,hwnd,CmdShow
invoke UpdateWindow,hwnd
.while TRUE
invoke GetMessage, addr msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage,addr msg
invoke DispatchMessage, addr msg
.endw
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL tvinsert:TV_INSERTSTRUCT
LOCAL tvhit:TV_HITTESTINFO
LOCAL tvItem:TVITEM
LOCAL hBitmap:dword
.if uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.elseif uMsg==WM_CREATE
invoke CreateWindowEx,NULL,addr TreeViewClassName,NULL,WS_CHILD+WS_VISIBLE\
+TVS_HASLINES+TVS_HASBUTTONS+TVS_LINESATROOT+TVS_EDITLABELS,0,0,\
300,200,hWnd,NULL,hInstance,NULL
mov hTreeView,eax
invoke ImageList_Create,13,14,ILC_COLOR32,3,0
mov hImageList,eax
invoke LoadBitmap,hInstance,IDR_BITMAP
mov hBitmap,eax
invoke ImageList_Add,hImageList,hBitmap,NULL
invoke SendMessage,hTreeView,TVM_SETIMAGELIST,TVSIL_NORMAL,hImageList
mov tvinsert.hParent,NULL
mov tvinsert.hInsertAfter,TVI_ROOT
mov tvinsert.item._mask,TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE
mov tvinsert.item.pszText,offset ParentText
mov tvinsert.item.iImage,0
mov tvinsert.item.iSelectedImage,1
invoke SendMessage,hTreeView,TVM_INSERTITEM,0,addr tvinsert
mov hParent,eax
mov tvinsert.hParent,eax
mov tvinsert.item._mask,TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE
mov tvinsert.hInsertAfter,TVI_FIRST
mov tvinsert.item.pszText,offset ChildText1
invoke SendMessage,hTreeView,TVM_INSERTITEM,0,addr tvinsert
mov tvinsert.hParent,eax
mov tvinsert.hInsertAfter,TVI_FIRST
mov tvinsert.item._mask,TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE
mov tvinsert.item.iImage,1
mov tvinsert.item.iSelectedImage,2
mov tvinsert.item.pszText,offset GrandsonText1
invoke SendMessage,hTreeView,TVM_INSERTITEM,0,addr tvinsert
mov tvinsert.item.pszText,offset GrandsonText2
invoke SendMessage,hTreeView,TVM_INSERTITEM,0,addr tvinsert
push hParent
pop tvinsert.hParent
mov tvinsert.hInsertAfter,TVI_LAST
mov tvinsert.item.iImage,0
mov tvinsert.item.iSelectedImage,1
mov tvinsert.item.pszText,offset ChildText2
invoke SendMessage,hTreeView,TVM_INSERTITEM,0,addr tvinsert
mov tvinsert.hParent,eax
mov tvinsert.item.iImage,1
mov tvinsert.item.iSelectedImage,2
mov tvinsert.hInsertAfter,TVI_FIRST
mov tvinsert.item.pszText,offset GrandsonText3
invoke SendMessage,hTreeView,TVM_INSERTITEM,0,addr tvinsert
mov tvinsert.hInsertAfter,TVI_LAST
mov tvinsert.item.pszText,offset GrandsonText4
invoke SendMessage,hTreeView,TVM_INSERTITEM,0,addr tvinsert
invoke DeleteObject,hBitmap
.elseif uMsg==WM_NOTIFY
push edi
mov edi,lParam
assume edi:ptr NMHDR
.if [edi].code==TVN_ENDLABELEDIT
mov eax,TRUE
ret
.elseif [edi].code==NM_RCLICK
invoke SendMessage,hTreeView,TVM_GETNEXTITEM, TVGN_CARET ,NULL
invoke SendMessage,hTreeView,TVM_EDITLABEL,NULL,eax
.elseif [edi].code==TVN_BEGINDRAG
assume edi:ptr NM_TREEVIEW
invoke SendMessage,hTreeView,TVM_CREATEDRAGIMAGE,0,[edi].itemNew.hItem
mov hDragImageList,eax
mov tvItem._mask,TVIF_HANDLE+TVIF_TEXT
mov tvItem.pszText,offset temp
mov tvItem.cchTextMax,sizeof temp
push [edi].itemNew.hItem
pop tvItem.hItem
invoke SendMessage,hTreeView,TVM_GETITEM,0,addr tvItem
invoke ImageList_BeginDrag, hDragImageList,0,0,0
invoke ImageList_DragEnter,hTreeView,[edi].ptDrag.x,[edi].ptDrag.y
invoke SetCapture,hWnd
mov DragMode,TRUE
.endif
assume edi:nothing
pop edi
.elseif uMsg==WM_MOUSEMOVE
.if DragMode==TRUE
mov eax,lParam
mov dx,ax
movzx edx,dx
shr eax,16
mov tvhit.pt.x,edx
mov tvhit.pt.y,eax
invoke ImageList_DragMove,edx,eax
invoke ImageList_DragShowNolock,FALSE
invoke SendMessage,hTreeView,TVM_HITTEST,NULL,addr tvhit
.if eax
invoke SendMessage,hTreeView,TVM_SELECTITEM,TVGN_DROPHILITE,eax
.endif
invoke ImageList_DragShowNolock,TRUE
.endif
.elseif uMsg==WM_LBUTTONUP
.if DragMode==TRUE
invoke ImageList_DragLeave,hTreeView
invoke ImageList_EndDrag
invoke ImageList_Destroy,hDragImageList
invoke SendMessage,hTreeView,TVM_GETNEXTITEM,TVGN_DROPHILITE,0
.if eax
mov tvinsert.hParent,eax
mov tvinsert.item.pszText,offset temp
mov tvinsert.item._mask,TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE
mov tvinsert.hInsertAfter,TVI_LAST
mov tvinsert.item.iImage,1
mov tvinsert.item.iSelectedImage,2
invoke SendMessage,hTreeView,TVM_SELECTITEM,TVGN_CARET,eax
invoke SendMessage,hTreeView,TVM_INSERTITEM,0,addr tvinsert
invoke SendMessage,hTreeView,TVM_SELECTITEM,TVGN_DROPHILITE,0
.endif
invoke ReleaseCapture
;invoke ShowCursor,TRUE
mov DragMode,FALSE
.endif
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -