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

📄 toolbar.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
字号:
include .\head.inc
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
.const
IDR_TOOLBAR    equ 101
IDR_BITMAP      equ 102
IDT_BLINE         equ 40001
IDT_BRECT        equ 40002
IDT_BELLIPSE   equ 40003
IDT_BTEXT        equ 40004
IDC_STATUS      equ 2000
.data
ClassName       db "WinClass",0
TitleName       db "工具栏状态条",0
tbButton        TBBUTTON <0,IDT_BLINE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0>
                TBBUTTON <1,IDT_BRECT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0>
                TBBUTTON <2,IDT_BELLIPSE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0>
                TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,>
                TBBUTTON <3,IDT_BTEXT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0>
Text            db "青山遮不住,毕竟东流去",0
StatusTipText   db "欢迎使用状态条",0

.data?
hInstance	HINSTANCE ?
hToolBar        HWND      ?
hStatusBar      HWND      ?
Rect            RECT      <>
nmhdr           NMHDR     <>
dwWidth         dd       5 dup (?)
buffer          db       10 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 hdc:HDC
        .if uMsg==WM_DESTROY
             invoke PostQuitMessage,NULL
        .elseif uMsg==WM_CREATE
             invoke CreateToolbarEx,hWnd,WS_CHILD+WS_BORDER + WS_VISIBLE+TBSTYLE_TOOLTIPS,IDR_TOOLBAR,5,\
                    hInstance,IDR_BITMAP,addr tbButton,5,0,0,0,0,sizeof TBBUTTON
             mov hToolBar,eax
             invoke CreateStatusWindow,WS_CHILD+WS_VISIBLE+CCS_BOTTOM+WS_BORDER ,addr StatusTipText,hWnd,IDC_STATUS
             mov hStatusBar,eax
        .elseif uMsg==WM_SIZE
             invoke GetClientRect,hWnd,addr Rect
             mov eax,Rect.right
             xor  edx,edx
             mov cx,5 
             div cx
             movzx eax,ax
             mov ecx,eax
             mov dwWidth,eax
             shl eax,1
             mov dwWidth+4,eax
             add eax,ecx
             mov dwWidth+8,eax
             add eax,ecx
             mov dwWidth+12,eax
             mov eax,Rect.right
             mov dwWidth+16,eax
             invoke SendMessage,hStatusBar,SB_SETPARTS,5,addr dwWidth
             invoke MoveWindow,hToolBar,0,0,0,0,TRUE
             invoke MoveWindow,hStatusBar,0,0,0,0,TRUE
             mov eax,Rect.top
             add eax,26
             mov Rect.top,eax

        .elseif uMsg==WM_COMMAND             
             invoke GetDC,hWnd
             mov hdc,eax
             invoke MoveToEx,hdc,Rect.left,Rect.top,NULL
             mov eax,wParam
             .if lParam
                  .if ax==IDT_BLINE
                    invoke LineTo,hdc,Rect.right,Rect.bottom
                  .elseif ax==IDT_BRECT
                    sub Rect.right,10
                    sub Rect.bottom,30
                    invoke Rectangle,hdc,Rect.left,Rect.top,Rect.right,Rect.bottom
                  .elseif ax==IDT_BELLIPSE
                    sub Rect.bottom,20
                    invoke Ellipse,hdc,Rect.left,Rect.top,Rect.right,Rect.bottom
                  .elseif ax==IDT_BTEXT
                    invoke DrawText,hdc,addr Text,-1,addr Rect,DT_VCENTER or DT_SINGLELINE or DT_CENTER
                  .endif
             .endif  
             invoke ReleaseDC,hWnd,hdc 
        .elseif uMsg==WM_NOTIFY
             invoke MemCopy,lParam,addr nmhdr,sizeof NMHDR
             .if nmhdr.code==TTN_NEEDTEXT
                push edi
                mov edi,lParam
                assume edi:ptr TOOLTIPTEXT
                mov eax,[edi].hdr.idFrom 
                mov [edi].lpszText,eax
                invoke LoadString,hInstance,eax,addr buffer,10
                invoke SendMessage,hStatusBar,SB_SETTEXT,1,addr buffer
                assume edi:nothing
                pop edi
             .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 + -