📄 buttonsubclass.asm
字号:
include .\head.inc
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
ButtonWndProc proto :DWORD,:DWORD,:DWORD,:DWORD
.data
ClassName db "ButtonClass",0
TitleName db "按钮窗口的子类化",0
ButtonClassName db "BUTTON",0
PushButtonText db "确定",0
RadioButtonText1 db "单选项1",0
RadioButtonText2 db "单选项2",0
CheckButtonText db "复选框",0
GroupBox db "组合框",0
RadioPrompt db "单行选项1被选中",0
UncheckedRadioPrompt db "单行选项1未被选中",0
CheckBoxPrompt db "复选中被选中",0
UncheckedCheckBoxPrompt db "复选中未被选中",0
ButtonTest db "按钮测试",0
TestTitle db "消息测试",0
.data?
hInstance HINSTANCE ?
hwndButtonPush HWND ?
hwndButtonRadio1 HWND ?
hwndButtonRadio2 HWND ?
hwndButtonCheckBox HWND ?
OldWndProc HWND ?
.const
ID_BUTTON_PUSH equ 1
ID_BUTTON_RADIO1 equ 2
ID_BUTTON_RADIO2 equ 3
ID_BUTTON_CHECKBOX equ 4
ID_BUTTON_GROUPBOX equ 5
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, NULL,NULL,NULL, SW_SHOWDEFAULT
invoke ExitProcess,eax
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_HAND
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,300,\
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
.if uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.elseif uMsg==WM_CREATE
invoke CreateWindowEx,NULL, ADDR ButtonClassName,addr GroupBox,\
WS_VISIBLE or WS_CHILD or BS_GROUPBOX ,95,45,85,75,\
hWnd,ID_BUTTON_GROUPBOX,hInstance,NULL
invoke CreateWindowEx,NULL, ADDR ButtonClassName,addr RadioButtonText1,\
WS_VISIBLE or WS_CHILD or BS_AUTORADIOBUTTON or BS_TOP ,\
100,65,75,20,hWnd,ID_BUTTON_RADIO1,hInstance,NULL
mov hwndButtonRadio1,eax
invoke CreateWindowEx,NULL, ADDR ButtonClassName,addr RadioButtonText2,\
WS_VISIBLE or WS_CHILD or BS_AUTORADIOBUTTON or BS_TOP ,\
100,95,75,20,hWnd,ID_BUTTON_RADIO1,hInstance,NULL
mov hwndButtonRadio2,eax
invoke CreateWindowEx,NULL, ADDR ButtonClassName,addr CheckButtonText,\
WS_VISIBLE or WS_CHILD or BS_AUTO3STATE or BS_TOP ,\
100,125,80,20,hWnd,ID_BUTTON_CHECKBOX,hInstance,NULL
mov hwndButtonCheckBox,eax
invoke CreateWindowEx,NULL, ADDR ButtonClassName,addr PushButtonText,\
WS_VISIBLE or WS_CHILD or BS_DEFPUSHBUTTON or BS_VCENTER ,\
100,150,80,20,hWnd,ID_BUTTON_PUSH,hInstance,NULL
mov hwndButtonPush,eax
invoke SetWindowLong,hwndButtonPush,GWL_WNDPROC,addr ButtonWndProc
mov OldWndProc,eax
.elseif uMsg==WM_COMMAND
mov eax,wParam
.if wParam
.if ax==ID_BUTTON_PUSH
shr eax,16
.if ax==BN_CLICKED
invoke SendMessage,hwndButtonRadio1,BM_GETSTATE,0,0
.if eax==BST_CHECKED
invoke MessageBox,NULL,addr RadioPrompt,addr TestTitle,MB_OK
.else
invoke MessageBox,NULL,addr UncheckedRadioPrompt,addr TestTitle,MB_OK
invoke SendMessage,hwndButtonRadio1,BM_SETCHECK,BST_CHECKED,0
invoke SendMessage,hwndButtonRadio2,BM_SETCHECK,BST_UNCHECKED,0
.endif
invoke SendMessage,hwndButtonCheckBox,BM_GETSTATE,0,0
.if eax==BST_CHECKED
invoke MessageBox,NULL,addr CheckBoxPrompt,addr TestTitle,MB_OK
.else
invoke MessageBox,NULL,addr UncheckedCheckBoxPrompt,addr TestTitle,MB_OK
invoke SendMessage,hwndButtonCheckBox,BM_SETCHECK,BST_INDETERMINATE,0
.endif
.endif
.endif
.endif
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
ButtonWndProc Proc hWnd:dword,uMsg:Dword,wParam:dword,lParam:dword
.if uMsg==WM_LBUTTONDOWN
invoke MessageBeep,MB_ICONQUESTION
invoke CallWindowProc,OldWndProc,hWnd,uMsg,wParam,lParam
.else
invoke CallWindowProc,OldWndProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
ButtonWndProc endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -