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 + -
显示快捷键?