Win32汇编-----对话框及窗口编程范例

本文介绍了Win32汇编语言中的窗口和对话框编程,包括WNDCLASSEX结构、CreateWindowEx函数的使用,以及窗口过程的实现。示例展示了如何创建窗口、子窗口,并解释了消息循环和MSG结构的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

;Win32汇编-----Hello,World!


.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szCaption db 'A MessageBox !',0
szText db 'Hello,World !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke MessageBox,NULL,offset szText,\
offset szCaption,MB_OK
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start




;Win32汇编编程----窗口建立范例

.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;include文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                      .data?
Hinstance      dd      ?
HwinMain       dd      ?


                     .const
lpszClassName db 'classname',0
lpWindowName  db  '永恒',0
lpstring      db   '太阳帝国万岁!!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;回调函数,窗口过程是给windows回调用的。

wndproc   proc    uses ebx edi esi,hwnd,msg,wparam,lparam                                ;要注意,窗口过程中要注意保存ebx,edi,esi和ebp寄存器,高级语言中不用操心着一点。

              local    ps:PAINTSTRUCT                                                                           ;在所有阶段的消息中,大部分的消息都不需要程序自己关心。windows只是尽义务通知窗口而已
              local hdc                                                                                                      ;窗口过程转手就交给DefWindowProc去处理了。程序需要关心的只有下面这些:

              local rect1:RECT                                                                                        ;WN_CREATE(放置窗口初始化代码,如建立个种子窗口状态栏工具栏),WM_SIZE(放置位置安                                                                                                                                      ;排的代码)WM_PAINT(如果需要自己绘制客户区,则在这里安排代码。)WM_CLOSE(向用户

                                                                                                                                    ;确认是否退出,如果退出则摧毁窗口并发送WM_QUIT消息)WM_DESTROY(窗口1摧毁)

          
              mov eax,msg
;*************************************************************************
             .if      eax == WM_PAINT
                  invoke BeginPaint,hwnd,addr ps
                  mov hdc,eax
                  invoke GetClientRect,hwnd,addr rect1
                  invoke DrawText,hdc,offset lpstring,-1,addr rect1,DT_CENTER or DT_LEFT
                  invoke EndPaint,hwnd,addr ps
;*************************************************************************                  
           .elseif   eax == WM_CLOSE
                  invoke DestroyWindow,hwnd
                  invoke PostQuitMessage,NULL
;*************************************************************************
            .else
                  invoke DefWindowProc,hwnd,msg,wparam,lparam
                  ret
            .endif
 ;************************************************************************           
            xor    eax,eax
            ret
            
wndproc  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain    proc                                                    
               local @wndclass:WNDCLASS
               local @stmsg:MSG
        
               invoke GetModuleHandle,NULL                                ;取模块句柄API,使用参数NULL调用该句柄得到的是调用者本模块的句柄
               mov Hinstance,eax                                                    ;Hinstance是实例。                       
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       
;WNDCLASS 结构,注册窗口        
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                 ;程序定义了一个WNDCLASSEX变量@stWndClass,用RtlZeroMemory将它填为全零
              invoke RtlZeroMemory,addr @wndclass,sizeof WNDCLASS                               ;再填写结构的各个字段,这样,没有赋值的部分就保持为零      
              mov    @wndclass.style,CS_VREDRAW or CS_HREDRAW                                 ;CS_VREDRAW 和 CS_HREDRAW表示窗口的高度或宽度改变时是否重画窗口
              mov    @wndclass.lpfnWndProc,offset wndproc                                                 ;最重要的参数,它指定了基于这个类建立窗口的窗口过程地址,通过这个参数
                                                                                                                                             ;windows就知道了在DispatchMessage函数里把窗口消息发到哪去,一个窗口过程
                                                                                                                                              ;可以为多个窗口服务,只要这些窗口是基于同一个 窗口类建立的。
              push   Hinstance                                                                                                   ;指定要注册窗口属于哪个模块,模块句柄在程序开始的地方,已经用GetModuleHandle函数                                                                                                                                              ;获得      
              pop    @wndclass.hInstance
              invoke LoadIcon,0,IDI_ERROR                                                                             ;windows已经预定义了一些图标同样程序可以使用在资源文件中定义的一些图标
                                                                                                                                           ;图标,这些图标可以用LoadIcon函数获得
              mov    @wndclass.hIcon,eax                                                                                ;图标句柄
              invoke LoadCursor,0,IDC_HELP                                                                             ;LoadCursor获取光标句柄
              mov    @wndclass.hbrBackground,COLOR_WINDOW+1                                   ;窗口客户区的背景色
              mov    @wndclass.lpszClassName,offset lpszClassName                                 ;lpszMenuName指定窗口上显示的默认菜单。窗口中的菜单也可以在CreateWindowEx的参                                                                                                                                               ;数中指定       
              invoke RegisterClass,addr @wndclass
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;创建窗口  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,offset lpszClassName,offset lpWindowName, WS_OVERLAPPEDWINDOW,\
                               100,100,500,500,NULL,NULL,offset Hinstance,NULL
                                                                                                                   ;CreateWindowEx函数使用方法是:
                                                                                                                  ; invoke CreateWindowEx,dwExstyle,lpClassName,lpWindowName,\
                                                                                                                 ;dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,IpParam
                                                                                                                        ;1,lpClassName,建立窗口使用的类名字符串指针。
                                                                                                                         ;2,lpWindowName,指向表示窗口名称的字符串。
                                                                                                                        ;3,hMenu窗口上要出现的菜单的句柄
                                                                                                                        ;4,lpParam,这是一个指针,指向一个欲传给窗口的参数,这个参数在
                                                                                                                           ;WM_CREATE消息中被获取,一般情况下用不到这个字段。
                                                                                                                        ;5,hInstance,模块句柄,和注册窗口类时一样,指定了窗口所属的程序模块。
                                                                                                                       ;6,hWndParent窗口所属的父窗口。
                                                                                                                       ;7,x,y指定窗口左上角的位置,单位是像素。
                                                                                                                      ;8,nWidth,nHeight窗口的宽度和高度。即窗口的大小。 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;显示更新窗口       
        mov HwinMain,eax
        invoke ShowWindow,HwinMain,SW_SHOWDEFAULT
        invoke UpdateWindow,HwinMain
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  消息循环
         .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                                                                         ;执行winmain
            invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start


附WNDCLASSEX结构   :

WNDCLASSEX         STRUCT

   cbsize                     DWORD         ?           ;结构的字节数

   style                         DWORD        ?            ;类风格

   lpfnwndproc            DWORD         ?           ;窗口过程的地址

   cbclsextra                DWORD        ?           

   cbwndextra              DWORD        ?    

   hinstance                 DWORD        ?           ;所属的实例句柄

   hicon                       DWORD         ?            ;窗口图标

   hcursor                   DWORD         ?            ;窗口光标

   hbrbackground       DWORD         ?           ;背景色

   lpszmenuname      DWORD         ?            ;窗口菜单

   lpszclassname      DWORD          ?            ;类名字符串的地址

   hiconsm                  DWORD         ?            ;小图标

WNDCLSSEX


;CreateWindowEx函数使用方法是:

      ; invoke CreateWindowEx,dwExstyle,lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,IpParam

      ;1,lpClassName,建立窗口使用的类名字符串指针。

      ;2,lpWindowName,指向表示窗口名称的字符串。

      ;3,hMenu窗口上要出现的菜单的句柄

      ;4,lpParam,这是一个指针,指向一个欲传给窗口的参数,这个参数在WM_CREATE消息中被获取,一般情况下用不到这个字段。

      ;5,hInstance,模块句柄,和注册窗口类时一样,指定了窗口所属的程序模块。

      ;6,hWndParent窗口所属的父窗口。

      ;7,x,y指定窗口左上角的位置,单位是像素。

      ;8,nWidth,nHeight窗口的宽度和高度。即窗口的大小。 

CreateWindowEx也可以用来建立子窗口,Windows中有许多预定义的子窗口类,如按钮和文本框的类名分别是“Button”和“Edit”。要建立一个按钮只需把lpClassName指向Button

字符串就可以了。

                            .data

szButton             db    'button',0

szButtonText      db    '&Ok',0

                       ...

                        invoke CreateWindowEx,NULL,\

                               offset szButton,offset szButtonText,\

                              WS_CHILD or WS_VISIBLE,\

                             10,10,65,22,\

                             hWnd,1,hInstance,NULL


消息循环中的几个函数要用到一个MSG结构,用来做消息传递

MSG STRUCT

      hwnd           DWORD              ?

      message    DWORD              ?

      wParam      DWORD              ?

      lParam        DWORD              ?

      time             DWORD              ?

      pt                 POINT                  <>

MSG  ENDS


hwnd,消息要发向的窗口句柄

message,消息标识符,在头文件中以WM_开头的预定义值

wParam,消息的参数之一

lParam,消息的参数之二

time,消息放入消息队列的时间

pt,这是一个POINT数据结构,表示消息放入消息队列时鼠标坐标

 这个结构定义了消息的所有属性,GetMessage函数就是从消息队列中取出这样一条消息的:

  invoke Getmessage1pMsg,hwnd,wMsgFilterMin,wMsgFilterMax

                  hWnd参数指定要获取哪个窗口,NULL表示获取本程序所属窗口的消息。wMsgFilterMin,wMsgFilterMax为0表示获取所有编号的消息。


窗口过程:

    窗口过程是给windows回调用的。

     窗口过程的子程序的参数格式为:

         WindowProc  proc      hwnd,uMsg,wParam,lParam gvbf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值