📄 toolbar.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 + -