我喷血建议所有的还对C++(VC)发愁的兄弟们都来学学WIN32位汇编~~~建议大家来看看~我自己的经历
如果你对VC(MFC)愁眉苦脸的话,我建议你们现把它暂时放下来,(那说明你对windows消息机制没理解)好好去学学WIN32汇编(记住不是DOS汇编),等你用它作出第一个窗口时我想你应该对WIN编程有个很清晰的认识了,我自己有很深刻的体验,而且比C(SDK)代码执行效率要高,更精简,更可以去逼迫你去认真学计算机体系结构(Intel80x86).都大有好处~~~我就是当是看MFC非常糊涂,最后究其原因是对WIN编程方法没有理解掌握,准备去学C(SDK),但我又买不其那本160元的《programming windows》其他资料太零碎了,偶而看到本WIN32汇编的CHM,看了看代码,都是调用API,感觉代码很清晰,很多原来不理解的地方豁然开朗,推荐罗云彬的新那本书。
现附上我用WIN32汇编写的第一个窗口程序:是不是感觉代码很优美?
.386
.model flat,stdcall
option casemap:none
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data?
hInstance dd ?
hWinMain dd ?
.const
szClassName db 'MyClass',0
szButton db 'button',0
szCaptionMain db 'My first Window!',0
szText db '狐狸糊涂',0
szButtonText db '&OK',0
.code
;窗口过程
_ProcWinMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam ;伪指令uses在子程序进入或退出时自动安插上push和pop寄存器指令
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
mov eax,uMsg ;uMsg 是接收的消息
.if eax == WM_PAINT ;如果是我们感兴趣的消息则加以处理,处理完后,在 eax 寄存器中传递 0
invoke BeginPaint,hWnd,addr @stPs
mov @hDc,eax
invoke GetClientRect,hWnd,addr @stRect
invoke DrawText,@hDc,addr szText,-1,\
addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd,addr @stPs
;.elseif eax == WM_CLOSE ;方法一
;invoke DestroyWindow,hWinMain ;DestroyWindow会引发一个WM_DESTROY消息
;invoke PostQuitMessage,NULL
.elseif eax == WM_DESTROY ;方法二
invoke PostQuitMessage,NULL
.elseif eax == WM_CREATE ;建立一个按钮
invoke CreateWindowEx,NULL,\
offset szButton,offset szButtonText,\
WS_CHILD or WS_VISIBLE,\
10,10,65,22,\
hWnd,1,hInstance,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax ;将eax清零后返回
ret
_ProcWinMain endp
_WinMain proc
local @stWndClass:WNDCLASSEX ;定义一个WNDCLASSEX结构的变量@stWndClass
local @stMsg:MSG
invoke GetModuleHandle,NULL ;得到应用程序的句柄
mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass ;将@stWndClass填为全零,再填写结构的各个字段
;注册窗口类
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance ;要注册的窗口类属于哪个模块
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass ;把结构的地址当参数一次性传给RegisterClassEx
;创建并显示窗口
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW ,\
offset szClassName,offset szCaptionMain,\
WS_OVERLAPPEDWINDOW or WS_VSCROLL,\
100,100,600,400,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain ;程序调用UpdateWindows,这个函数向窗口过程发送一条WM_PAINT消息
;消息循环
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage, addr @stMsg
.endw
ret
_WinMain endp
start:
call _WinMain
invoke ExitProcess,NULL
end start
其实WINDOWS编程说白就是用户在窗口作了动作,WINDOWS发消息给应用程序,用它的窗口过程来相应消息。谁掌握的API多+对OS的理解,WINDOWS编程不难