subwin.asm
来自「windows下汇编语言 学习汇编语言好助手」· 汇编 代码 · 共 169 行
ASM
169 行
;******************************
;文件:SubWin.asm *
;功能:动态生成及使用子窗口 *
;******************************
.386p
.model flat,stdcall
include win32.inc
extrn GetMessageA:proc
extrn TranslateMessage:proc
extrn DispatchMessageA:proc
extrn ShowWindow:proc
extrn UpdateWindow:proc
extrn CreateWindowExA:proc
extrn RegisterClassA:proc
extrn DefWindowProcA:proc
extrn MessageBoxA:proc
extrn ExitProcess:proc
extrn LoadIconA:proc
extrn LoadCursorA:proc
extrn GetStockObject:proc
extrn GetModuleHandleA:proc
extrn PostQuitMessage:proc
extrn SendMessageA:proc
extrn GetWindowTextA:proc
NULL = 0
WS_EX_CLIENTEDGE = 0200h
LB_DELETESTRING = 0182H
LB_ADDSTRING = 0180H
POINT struc
x dd ?
y dd ?
ends
MSG struc
hwnd dd ?
message dd ?
wParam dd ?
lParam dd ?
time dd ?
pt POINT<>
ends
WNDCLASS struc
style dd ?
lpfnWndProc dd ?
cbClsExtra dd ?
cbWndExtra dd ?
hInstance dd ?
hIcon dd ?
hCursor dd ?
hbrBackground dd ?
lpszMenuName dd ?
lpszClassName dd ?
ends
.data
Text db 256 dup (0)
myclassname db 'MyClass',0
caption db '子窗口使用示例',0
align 4
hInst dd ?
hWnd dd ?
hBUTTON dd ?
hLISTBOX dd ?
hEDIT dd ?
cList dd 0
msg MSG<>
wc WNDCLASS<>
.code
main:
call GetModuleHandleA,0
mov [hInst],eax
mov wc.lpszClassName,offset myclassname
mov eax,[hInst]
mov wc.hInstance,eax
mov wc.lpfnWndProc,offset WinMsgProc
call LoadIconA,0,IDI_APPLICATION
mov wc.hIcon,eax
call LoadCursorA,0,IDC_IBEAM
mov wc.hCursor,eax
mov wc.lpszMenuName,0
call GetStockObject,WHITE_BRUSH
mov wc.hbrBackground,eax
mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_GLOBALCLASS
mov wc.cbClsExtra,0
mov wc.cbWndExtra,0
call RegisterClassA,offset wc ;注册窗口类
;建立窗口
call CreateWindowExA,WS_EX_CLIENTEDGE,offset myclassname,offset caption,WS_OVERLAPPEDWINDOW, 100,100,450,300,0,0,[hInst],0
mov [hWnd],eax
call ShowWindow,[hWnd],1
call UpdateWindow,[hWnd]
MsgLoop: ;消息循环
call GetMessageA,offset msg,0,0,0
or eax,eax
jz Exit
call TranslateMessage,offset msg
call DispatchMessageA,offset msg
jmp MsgLoop
Exit:
call ExitProcess,0
;*********************************************************
;消息处理
WinMsgProc proc uses ebx edi esi, handle:DWORD, wMsg:DWORD, wParam1:DWORD, lParam1:DWORD
cmp wMsg,WM_CREATE
jz create
cmp wMsg,WM_DESTROY
jz destory
cmp wMsg,WM_COMMAND
jz command
jmp default
create:
call InitSubWin,handle
xor eax,eax
ret
command:
mov eax,hBUTTON
cmp lParam1,eax
jnz default
;把Edit控制中的文字加入LISTBOX
call GetWindowTextA,hEDIT,offset Text,256
call SendMessageA,hLISTBOX,LB_ADDSTRING,0,offset Text
cmp cList,10 ;满10条?
jnb delitem
inc cList
xor eax,eax
ret
delitem: ;删除1条
call SendMessageA,hLISTBOX,LB_DELETESTRING,0,0
xor eax,eax
ret
destory:
call PostQuitMessage,0
xor eax,eax
ret
default:
call DefWindowProcA,handle,wMsg,wParam1,lParam1
ret
WinMsgProc endp
;*************************************************
szBUTTON db 'button',0
szLISTBOX db 'listbox',0
szEDIT db 'EDIT',0
szSTATIC db 'STATIC',0
szBUTTON_TEXT db '加入',0
szLISTBOX_TEXT db '列表',0
szEDIT_TEXT db '编辑',0
szSTATIC_TEXT db '请编辑并单击“加入”',0
;生成子窗口
InitSubWin proc hMain:DWORD
call CreateWindowExA,0,offset szLISTBOX,offset szLISTBOX_TEXT, WS_CHILD or WS_OVERLAPPEDWINDOW or WS_VISIBLE or WS_VSCROLL, 200,40,200,120,hMain,0,0,0
mov hLISTBOX,eax
call CreateWindowExA,0,offset szSTATIC ,offset szSTATIC_TEXT, WS_CHILD or WS_VISIBLE, 10,70 ,180,20,hMain,0,0,0
call CreateWindowExA,WS_EX_CLIENTEDGE ,offset szEDIT ,offset szEDIT_TEXT, WS_CHILD or WS_VISIBLE, 10,100,180,20,hMain,0,0,0
mov hEDIT,eax
call CreateWindowExA,0,offset szBUTTON ,offset szBUTTON_TEXT, WS_CHILD or WS_VISIBLE, 200,180,60,30,hMain,0,0,0
mov hBUTTON,eax
ret
InitSubWin endp
end main
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?