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

📄 superclass.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
字号:
include .\head.inc
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
EditWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
ClassName                       db "EditClass",0
TitleName                        db "中英文区别输入",0
EditClassName                 db "EDIT",0
SuperClassName               db "EDITSUPERCLASS",0
.data?
hInstance                          HINSTANCE ?
OldWndProc                     LPSTR     ?
hwndEditEnglishInput        HWND      ?
hwndEditChineseInput        HWND      ?
.const
ID_EDIT_ENGLISH            equ 1
ID_EDIT_CHINESE            equ 2
.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
   LOCAL wc:WNDCLASSEX
   .if uMsg==WM_DESTROY
      invoke PostQuitMessage,NULL
   .elseif uMsg==WM_CREATE 
      mov wc.cbSize,sizeof WNDCLASSEX
      invoke GetClassInfoEx,NULL,addr  EditClassName,addr wc
      mov eax,wc.lpfnWndProc
      mov OldWndProc,eax
      mov wc.lpfnWndProc,offset EditWndProc
      mov wc.lpszClassName,offset SuperClassName
      invoke RegisterClassEx,addr wc
      invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR SuperClassName,NULL,\
         WS_VISIBLE or WS_CHILD,80,20,180,50,hWnd,ID_EDIT_ENGLISH,hInstance,NULL
      mov hwndEditEnglishInput,eax
      invoke SetFocus ,hwndEditEnglishInput	
      invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR SuperClassName,NULL,\
         WS_VISIBLE or WS_CHILD,80,120,180,50,hWnd,ID_EDIT_CHINESE,hInstance,NULL
      mov hwndEditChineseInput,eax
   .else
      invoke DefWindowProc,hWnd,uMsg,wParam,lParam
      ret
   .endif
   xor    eax,eax
   ret
WndProc endp
EditWndProc PROC hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
   LOCAL  ID:DWORD
   .if uMsg==WM_CHAR
      invoke GetWindowLong,hEdit,GWL_ID
      mov ID,eax
      .if wParam==VK_BACK
         jmp backspace
      .endif 
      mov eax,wParam
      test al,80H
      .if  ZERO? 
         .if ID==ID_EDIT_ENGLISH
backspace:
            invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam          
            ret
         .else 
            invoke MessageBeep,MB_ICONASTERISK
         .endif
      .else
         .if ID==ID_EDIT_CHINESE
            invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam          
            ret
         .else 
            invoke MessageBeep,MB_ICONASTERISK
         .endif   
      .endif
   .elseif uMsg==WM_KEYDOWN
      .if wParam==VK_TAB
         invoke GetWindow,hEdit,GW_HWNDNEXT
         .if eax==NULL
            invoke GetWindow,hEdit,GW_HWNDFIRST
         .endif
         invoke SetFocus ,eax
         xor eax,eax
         ret  
      .else  
         invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam
         ret
      .endif
   .else
      invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam
      ret
   .endif
   xor eax,eax
   ret
EditWndProc endp
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -