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

📄 buttonsubclass.asm

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