📄 editsubclass.asm
字号:
include .\head.inc
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
EditWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
HToAscii proto :dword,:dword
.data
ClassName db "EditClass",0
TitleName db "无符号十六进制数",0
ButtonClassName db "BUTTON",0
EditClassName db "EDIT",0
PushButtonText db "转换十进制",0
ClearNull db " ",0
Buffer db 11 dup (0)
.data?
hInstance HINSTANCE ?
hwndButtonPush HWND ?
OldWndProc LPSTR ?
hwndEditInput HWND ?
hwndEditOutput HWND ?
.const
ID_BUTTON_PUSH equ 1
ID_EDIT 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
.if uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.elseif uMsg==WM_CREATE
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,WS_VISIBLE or WS_CHILD,80,50,180,20,hWnd,ID_EDIT,hInstance,NULL
mov hwndEditInput,eax
invoke SetWindowLong,hwndEditInput,GWL_WNDPROC,addr EditWndProc
mov OldWndProc,eax
invoke SetFocus ,hwndEditInput
invoke CreateWindowEx,NULL, ADDR ButtonClassName,addr PushButtonText,WS_VISIBLE or WS_CHILD or BS_DEFPUSHBUTTON or BS_VCENTER,120,100,80,30,hWnd,ID_BUTTON_PUSH,hInstance,NULL
mov hwndButtonPush,eax
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,WS_VISIBLE or WS_CHILD or ES_READONLY,80,180,180,20,hWnd,ID_EDIT,hInstance,NULL
mov hwndEditOutput,eax
.elseif uMsg==WM_COMMAND
mov eax,wParam
.if lParam
.if ax==ID_BUTTON_PUSH
shr eax,16
.if ax==BN_CLICKED
invoke SendMessage, hwndEditInput,WM_GETTEXT,9,addr Buffer
invoke htodw,addr Buffer; 十六进制的字符串转换为双字保存于EAX中。
invoke HToAscii,eax,addr Buffer; eax中的双字转换为十进制的字符串。
lea esi,Buffer
FilterZero:
cmp byte ptr [esi],'0'
jnz next
inc esi
jmp FilterZero
next:
invoke SendMessage,hwndEditOutput,WM_SETTEXT,0,esi
.endif
.endif
.endif
.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
.if uMsg==WM_CHAR
cmp wParam,VK_BACK
jz backspace
invoke SendMessage, hEdit,WM_GETTEXT,9,addr Buffer
.if eax>7
invoke MessageBeep,MB_ICONASTERISK
xor eax,eax
ret
.endif
mov eax,wParam
.if (al>='0' && al<='9') || (al>='A' && al<='F') || (al>='a' && al<='f')
.if al>='a' && al<='f'
sub al,20h
.endif
invoke CallWindowProc,OldWndProc,hEdit,uMsg,eax,lParam
ret
.else
invoke MessageBeep,MB_ICONASTERISK
.endif
.else
backspace:
invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
EditWndProc endp
HToAscii PROC uses esi edi ebx edx reg:dword ,temp:dword; 十六进制数转换化十进制的字符。
mov eax,reg
mov ebx,temp
mov esi,10
mov ecx,10
again:
xor edx,edx
div ecx
add dl,30h
dec esi
mov [ebx][esi],dl
or esi,esi
jnz again
ret
HToAscii endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -