⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treeview.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 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 + -