第二篇 第一个窗口程序

这篇博文介绍下一个简单的窗口的建立过程。

 

一、建立窗口的过程如下:

1、注册窗口类---利用建立的窗口类建立窗口---消息循环等待处理消息

2、主要的函数如下:

RegisterClassEx---[  CreateWindowEx    ShowWindow   UpdateWindow   ]

---[  GetMessage   TranslateMessage    DispatchMessage   ]

 

二、Windows的消息处理机制:

三、窗口代码:

.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
szCaptionMain   db      'My First Window !',0
szText          db      'Win32 Assembly,Simple and Powerful !',0

.code
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;_ProcWinMain就是窗口过程了
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_ProcWinMain    proc    uses ebx edi esi,hWnd,uMsg,wParam,lParam
                local   @stPs:PAINTSTRUCT
                local   @stRect:RECT
                local   @hDc

                mov eax,uMsg

		;在调用UpdateWindow时发送WM_PAINT消息
		;绘制客服区
                .if     eax == WM_PAINT
                        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

		;点击了窗口右上方的‘X’时会发送WM_CLOSE消息
		;DestroyWindow用来销毁主窗口
		;PostQuitMessage用来发送WM_QUIT消息,不发送会发现窗口销毁进程任存在
		;因为消息循环还在
                .elseif eax == WM_CLOSE
                        invoke  DestroyWindow,hWinMain
                        invoke  PostQuitMessage,NULL

		;默认的窗口过程,用户不处理的消息都要交予TA处理,否则容易出错
                .else
                        invoke  DefWindowProc,hWnd,uMsg,wParam,lParam
                        ret

                .endif

                xor     eax,eax
                ret
_ProcWinMain    endp

_WinMain        proc
                local   @stWndClass:WNDCLASSEX
                local   @stMsg:MSG

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;注册窗口类
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
		;获得模块句柄hInstance
                invoke  GetModuleHandle,NULL
                mov     hInstance,eax

		;将 @stWndClass 变量清零,因为这是个struct,其中的一些变量我们
		;不关心也不会去设置,清零使得程序更加健壮和易于把握
                invoke  RtlZeroMemory,addr @stWndClass,sizeof @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 

		;这里指定了窗口的窗口过程
                mov     @stWndClass.lpfnWndProc,offset _ProcWinMain  

                mov     @stWndClass.hbrBackground,COLOR_HIGHLIGHT + 1

		;给窗口类指定名字
                mov     @stWndClass.lpszClassName,offset szClassName

                invoke  RegisterClassEx,addr @stWndClass

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;利用已经建立的窗口类建立窗口
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                invoke  CreateWindowEx,WS_EX_CLIENTEDGE,\
                        offset szClassName,offset szCaptionMain,\
                        WS_OVERLAPPEDWINDOW,\
                        100,100,600,400,\
                        NULL,NULL,hInstance,NULL
                mov     hWinMain,eax
                invoke  ShowWindow,hWinMain,SW_SHOWNORMAL
                invoke  UpdateWindow,hWinMain

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;消息循环
;GetMessage进消息队列中取消息,如果是WM_QUIT则返回0,此时消息循环退出
;TranslateMessage是将键盘信息转换成ASCII码
;DispatchMessage会调用在窗口类注册时指定的窗口函数处理消息
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                .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:
                invoke  _WinMain
                invoke  ExitProcess,NULL        ;退出进程

                end     start


四、运行结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值