码迷,mamicode.com
首页 > Windows程序 > 详细

【win32汇编】0x04 第一个窗口程序

时间:2016-04-23 11:55:43      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

第一个win32汇编窗口程序,主要来自 win32汇编语言程序设计,然后加上了自己查阅msdn文档的一些理解,基本过程:

start入口地址 --> _WinMain主函数 --> 定义一些需要用的消息实体和类实体 --> 注册窗口类 --> 建立并显示窗口 --> 消息循环

( _ProcMain主要用于处理程序接受的消息 )

  1 ;模式定义
  2 ;>>>>>>>>>>>>>>>>>>>>>>>
  3 .386            ;需要的指令集 (80386)
  4 .model flat,stdcall
  5 option casemap:none
  6 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  7 ;Include 文件定义
  8 ;>>>>>>>>>>>>>>>>>>>>>>>>
  9 include windows.inc
 10 include user32.inc
 11 includelib user32.lib
 12 include kernel32.inc
 13 includelib kernel32.lib
 14 
 15 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 16 ;数据段
 17 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 18     .data?            ;未初始化
 19 hInstance dd    ?    ;本程序的句柄
 20 hWinMain  dd    ?    ;本程序主窗口
 21 
 22         .const
 23 szClassName    db    MyClass,0            ;窗口名字
 24 szCaptionMain    db    My first Window !,0    ;窗口标题栏文字
 25 szText        db    Win32 Assembly, Simple and powerful !,0    ;窗口文字
 26 
 27 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 28 ;代码段
 29 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 30     .code
 31 ;********************************************************************
 32 ; 定义窗口过程
 33 ; hWnd:窗口句柄
 34 ; uWsg:消息标识
 35 ; wParm:消息附带参数
 36 ; lParam:消息附带参数
 37 ;********************************************************************
 38 ;uses伪操作在进入时自动加上push,退出时自动加上pop,保护这些寄存器,否则程序出错
 39 _ProcWinMain    proc    uses ebx edi esi hWnd,uMsg,wParam,lParam
 40         local    @stPs:PAINTSTRUCT    ;接受绘制窗口信息
 41         local    @stRect:RECT
 42         local    @hDc
 43         mov    eax,uMsg
 44         .if    eax ==    WM_PAINT    ;可以在showwindow或者updatewindow的时候获得这个消息,从而用这个消息来自己定制窗口
 45             invoke    BeginPaint,hWnd,addr @stPs
 46             mov    @hDc,eax    ;函数是否运行成功,为NULL表示运行失败
 47             invoke    GetClientRect,hWnd,addr @stRect    ;stRect获取窗口显示文本的信息
 48             ;绘制文本
 49             invoke    DrawText,@hDc,addr szText,-1, 50                 addr @stRect, 51                 DT_SINGLELINE or DT_CENTER or DT_VCENTER
 52             invoke    EndPaint,hWnd,addr @stPs
 53         .elseif    eax ==    WM_CLOSE
 54             invoke    DestroyWindow,hWinMain    ;摧毁窗口
 55             invoke    PostQuitMessage,NULL    ;退出码(必要)
 56         .else
 57             invoke    DefWindowProc,hWnd,uMsg,wParam,lParam    ;将不感兴趣的消息交给系统处理
 58             ret
 59         .endif
 60         
 61         xor eax,eax    ;清空eax为0
 62         ret            ;一般默认返回0表示处理信息成功
 63 _ProcWinMain endp
 64 
 65 ;********************************************************************
 66 ; main函数
 67 ;********************************************************************
 68 _WinMain    proc
 69         local @stWndClass:WNDCLASSEX    ;定义实体stWndClass
 70         local @stMsg:MSG                ;定义消息实体
 71         
 72         invoke GetModuleHandle,NULL        ;获取当前程序的句柄
 73         mov hInstance,eax                ;把获得的句柄赋值给hInstance
 74         invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass;清零    
 75 ;********************************************************************
 76 ; 注册窗口类
 77 ;********************************************************************
 78         invoke LoadCursor,0,IDC_ARROW    ;加载光标
 79         mov @stWndClass.hCursor,eax    ;光标
 80         push hInstance
 81         pop @stWndClass.hInstance    ;窗口类所属模块
 82         mov @stWndClass.cbSize,sizeof WNDCLASSEX    ;WNDCLASSEX大小
 83         mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW;窗口风格
 84         ;指定基于这个类建立的窗口过程地址(重要)
 85         mov @stWndClass.lpfnWndProc,offset _ProcWinMain
 86         mov    @stWndClass.hbrBackground,COLOR_WINDOW + 1    ;窗口客户区背景色
 87         mov    @stWndClass.lpszClassName,offset szClassName;要建立的类的命名
 88         invoke    RegisterClassEx,addr @stWndClass    ;注册类 stWndClass
 89 ;********************************************************************
 90 ; 建立并显示窗口
 91 ;********************************************************************
 92         invoke CreateWindowEx,        ;创建一个窗口
 93             WS_EX_CLIENTEDGE,\        ;有sunken edge 的窗口???
 94             offset szClassName,\    ;窗口类的名字
 95             offset szCaptionMain,\    ;窗口类的标题文字
 96             WS_OVERLAPPEDWINDOW,\    ;窗口的一些属性
 97             100,100,600,400,\        ;位置(x,y) 宽高(width,height)
 98             NULL,NULL,\                ;可选项
 99             hInstance,NULL;            ;句柄,参数【可选】
100         mov hWinMain,eax            ;把新建到的窗口的句柄给hWinMain
101         invoke ShowWindow,hWinMain,SW_SHOWNORMAL    ;显示窗口,正常显示
102         invoke    UpdateWindow,hWinMain                ;更新窗口的主要部分
103 ;********************************************************************
104 ; 消息循环
105 ;********************************************************************
106         .while TRUE
107             invoke GetMessage,addr @stMsg,NULL,0,0
108             .break .if eax == 0        ;如果点击了退出就结束程序
109             invoke TranslateMessage,addr @stMsg    ;进行键盘消息的转换
110             invoke DispatchMessage,addr @stMsg    ;将消息发送到对应窗口的过程处理函数中处理
111         .endw
112         ret
113 _WinMain endp
114 
115 ;********************************************************************
116 ; 程序入口地址
117 ;********************************************************************
118 start:
119     call _WinMain
120     invoke ExitProcess,NULL    ;退出程序
121 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
122     end start

 

【win32汇编】0x04 第一个窗口程序

标签:

原文地址:http://www.cnblogs.com/driedfish/p/5424203.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!