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