我喷血建议所有的还对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编程不难