注册 登录
编程论坛 汇编论坛

请教:win32汇编生成按钮问题

happycookie 发布于 2007-09-02 10:18, 1179 次点击

是用CreateWindowEx函数吗

类型是BS_PUSHBUTTON吗

4 回复
#2
cham2007-09-19 18:31

.386
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib

BUTTONID equ 1
.const
szClassName db 'MYCLASS',0
szCaption db 'MY WINDOW',0
szText db '创建按钮',0
ButtonClassName db 'BUTTON',0
ButtonText db 'My Button',0

.data?
hInstance dd ?
hWinMain dd ?

.code
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam
LOCAL PS:PAINTSTRUCT
LOCAL @Rect:RECT
LOCAL hdc
mov eax,uMsg
.if eax==WM_PAINT
invoke BeginPaint,hWnd,addr PS
mov hdc,eax
invoke GetClientRect,hWnd,addr @Rect
invoke DrawText,hdc,addr szText,-1,addr @Rect,DT_TOP
invoke EndPaint,hWnd,addr PS
.elseif eax==WM_CLOSE
invoke DestroyWindow,hWnd
.elseif eax==WM_DESTROY
invoke PostQuitMessage,NULL
.elseif eax==WM_CREATE
invoke CreateWindowEx,NULL,addr ButtonClassName,addr ButtonText,WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,200,200,140,20,hWnd,BUTTONID,hInstance,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret

_ProcWinMain endp
_WinMain proc
LOCAL WC:WNDCLASSEX
LOCAL msg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory,addr WC,sizeof WC
invoke LoadCursor,NULL,IDC_CROSS
mov WC.hCursor, eax
invoke LoadIcon,NULL,IDI_APPLICATION
mov WC.hIcon,eax
push hInstance
pop WC.hInstance
mov WC.cbSize,sizeof WNDCLASSEX
mov WC.style,CS_HREDRAW or CS_VREDRAW
mov WC.lpfnWndProc,offset _ProcWinMain
mov WC.cbClsExtra,0
mov WC.cbWndExtra,0
mov WC.hbrBackground,COLOR_WINDOW+1
mov WC.lpszMenuName,NULL
mov WC.lpszClassName,offset szClassName
invoke RegisterClassEx,addr WC
invoke CreateWindowEx,WS_EX_CLIENTEDGE,\

offset szClassName,offset szCaption,\

WS_OVERLAPPEDWINDOW,\

100,100,600,400,\

NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
.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


start:
call _WinMain
invoke ExitProcess,eax
end start

注意GetMessage函数的第二个参数,应为NULL,如果写了hWinMian的话,子窗口不会退出的,俺吃过亏了!

[此贴子已经被作者于2007-9-19 18:39:05编辑过]

#3
无理取闹2007-09-19 19:57
关键是类名'BUTTON'
#4
ymqq2011-08-24 21:41
你们 真是好人啊,我找了 好久 才发现 。。。。谢谢。
#5
怪人老三2012-02-23 01:28
怎么给按钮写一个事件?
1