1.窗口程序的运行模式:消息驱动

2.窗口程序实现大部分功能的代码应该呆在同一个模块中——“消息处理”模块,这个模块可以随时应付所有类型的消息,只有这样才能随时响应用户的各种操作。

3.窗口程序的运行过程:

4.窗口的回调函数,也叫窗口过程(由Windows自身调用)。窗口过程构造了一个分支结构,对应不同的消息执行不同的代码,一个应用程序几乎所用的功能代码都集中在窗口过程里面。

5.Windows在系统内部有一个系统消息队列;Windows为每个程序(严格来讲是每个线程)维护一个消息队列。

6.模块:一个模块代表的是一个运行中的exe文件或dll文件,用来代表这个文件中所用的代码和资源,磁盘上的文件不是模块,装入内存后运行时就叫模块。一个应用程序调用其他dll中的API是,这些dll文件被装入内存,就产生了不同的模块,为了区分地址空间中的不同模块,每一个模块都有一个唯一的模块句柄来标识。

在win32中,模块句柄在数值上等于程序在内存中装入的起始地址。可以使用GetModuleHandle 获取模块句柄。

7.句柄:句柄只是一个数值,无实际意义,被Windows用于表示各种资源的编号。

8.CreateWindowEx也可以用来创建子窗口,如按钮。

9.回调函数:所有应用程序提供给Windows的回调函数都必须注意保存 ebx,edi,esi,ebp寄存器,因为Windows内部将这四个寄存器当做指针使用。

9.1.定义用户消息的时候,一般使用WM_USER+x(x从1开始)的形式。

9.2.默认处理函数是DefWindowProc。

9.3.接收到WM_CLOSE消息时,应调用DestroyWindow 来摧毁窗口,并调用PostQuitMessage 向消息循环发送WM_QUIT消息来退出消息循环。

10.SendMessage直接调用其他窗口过程来处理某个消息,并等待处理完后返回。

PostMessage将消息放到消息队列,然后返回,此时消息可能还没有处理完。

另外,当消息参数中用到指针时,用PostMessage函数来发送消息是不会成功的。


窗口模板:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; FirstWindow.asm
; 窗口程序的模板代码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff FirstWindow.asm
; Link /subsystem:windows FirstWindow.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.386.model flat,stdcalloption casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
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    proc    uses ebx edi esi hWnd,uMsg,wParam,lParamlocal   @stPs:PAINTSTRUCTlocal @stRect:RECTlocal  @hDcmov    eax,uMsg
;********************************************************************.if    eax ==    WM_PAINTinvoke  BeginPaint,hWnd,addr @stPsmov  @hDc,eaxinvoke GetClientRect,hWnd,addr @stRectinvoke  DrawText,@hDc,addr szText,-1,\addr @stRect,\DT_SINGLELINE or DT_CENTER or DT_VCENTERinvoke    EndPaint,hWnd,addr @stPs
;********************************************************************.elseif    eax ==    WM_CLOSEinvoke  DestroyWindow,hWinMaininvoke    PostQuitMessage,NULL
;********************************************************************.elseinvoke    DefWindowProc,hWnd,uMsg,wParam,lParamret.endif
;********************************************************************xor    eax,eaxret_ProcWinMain  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain    proclocal   @stWndClass:WNDCLASSEXlocal    @stMsg:MSGinvoke   GetModuleHandle,NULLmov hInstance,eaxinvoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
;********************************************************************
; 注册窗口类
;********************************************************************invoke LoadCursor,0,IDC_ARROWmov   @stWndClass.hCursor,eaxpush    hInstancepop    @stWndClass.hInstancemov   @stWndClass.cbSize,sizeof WNDCLASSEXmov    @stWndClass.style,CS_HREDRAW or CS_VREDRAWmov  @stWndClass.lpfnWndProc,offset _ProcWinMainmov @stWndClass.hbrBackground,COLOR_WINDOW + 1mov @stWndClass.lpszClassName,offset szClassNameinvoke RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\WS_OVERLAPPEDWINDOW,\100,100,600,400,\NULL,NULL,hInstance,NULLmov  hWinMain,eaxinvoke  ShowWindow,hWinMain,SW_SHOWNORMALinvoke UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************.while TRUEinvoke  GetMessage,addr @stMsg,NULL,0,0.break  .if eax == 0invoke    TranslateMessage,addr @stMsginvoke DispatchMessage,addr @stMsg.endwret_WinMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:call  _WinMaininvoke  ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>end    start

Win32汇编——第一个窗口程序相关推荐

  1. 4.2第一个窗口程序

    创建Win32工程和MessageBox函数 前面讲的程序都是使用控制台界面来接受输入.显示输出的.要想使用窗口界面与用户交互必须首先创建一个Win32工程. (1)运行VC++6.0,选择菜单命令& ...

  2. Eclipse中创建第一个窗口程序

      之前在VS中用C#做程序开发时,做的最多的是Winform窗口.现在学习在Eclipse中用java编程序,也希望尽快学习如何写窗口程序,但是在选择Eclipse做开发工具的时候就听说Eclips ...

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

    第一个win32汇编窗口程序,主要来自 win32汇编语言程序设计,然后加上了自己查阅msdn文档的一些理解,基本过程: start入口地址 --> _WinMain主函数 --> 定义一 ...

  4. Win32 汇编环境和入门程序图解

    一 安装 在安装的最后,执行VBS脚本,在桌面建立快捷方式:执行快捷方式,会调入Win32汇编的编辑器qeditor.exe,进入到开发环境 二 构建Hello World程序 ;.386是伪指令 告 ...

  5. windows第一个窗口程序转自windows程序设计王艳平老师编著

    转 目录:   1.窗口程序  2.分析        注册窗口类别        建立窗口        显示窗口        消息循环        窗口消息处理程序    3.注意事项 窗口程 ...

  6. 使用Qt生成第一个窗口程序

    一.打开QtCreater,点击New Project 二.在Qt中,最常用的窗口程序为widgets控件程序,这里我们选择Qt Widgets Application 三.Qt生成的debug和re ...

  7. 使用VS创建第一个窗口程序

    我觉得C#或者说整个VS的开发环境或者功能对我最有吸引力的不是什么控制台程序,这种程序或者功能的实现使用Python等脚本语言实现起来似乎是更为便捷.对我真正有吸引力的是Windows的窗口程序. 接 ...

  8. distiller的另一个实例正忙于启动_PYQT5学习(02):利用Qt Designer制作第一个窗口程序

    目标 利用Qt Designer设计窗口界面 使用PyUIC把Qt Designer生成的UI文件转换为py文件 使用转换生成的py文件 创建项目 启动启动pycharm并创建项目 这一环节在这里就不 ...

  9. 【C#】SharpDevelop使用教程,C#写windows下第一个窗口程序,简单粗暴,初学者进,全图文,一看就明白

    VS不说,功能强大,但是挺大. 下面,来说说轻量级IDE来写一个简单的windows程序. 首先,下载,不说了,最新版本5.x需要.net4.x支持,需要先安装.net framework 4.x框架 ...

最新文章

  1. Adobe flash cs5 的Java运行时环境初始化错误 完美解决方法
  2. [Google Guava] 使用和避免null
  3. python面向对象基础
  4. java jfreechar鱼刺图_java使用jfreechar绘制饼型统计图
  5. 转 alsa录音放音执行流程详解
  6. MongoDB 入门之安装篇
  7. 一张倾斜图片进行矫正 c++_专业性文章:10分钟矫正骨盆前倾
  8. 向量表示 运动抛物线_流动的美丽函数——抛物线浅谈
  9. 如何计算列表项的出现?
  10. 软件技术方案_智慧工地整体解决方案核心系统有哪些?
  11. Python成员修饰符,metaclass,异常,反射,单例
  12. java8学习之方法引用详解及默认方法分析
  13. 《软件工程导论》考研复习
  14. wifi模块连接远程服务器,ESP8266 WIFI 模块与 Arduino 串口通信实现远程控制
  15. 【供应链架构day8】履约系统的架构长什么样子:从需求开始讲起
  16. 苹果手机html转pdf文件怎么打开吗,今天才知道,苹果手机打开这个功能,可以将纸质文档转为Word...
  17. 主板烧糊,大短路,不开机且烧糊成碳了还会导电
  18. 携程面试官问我怎么划分 Java 虚拟机内存区域,相见恨晚!
  19. Web应用中设置欢迎页面
  20. php的标准输入与输出

热门文章

  1. qt文件怎么设置全局变量_QT编程之——使用全局变量
  2. jsecharts如何改变占比_沪苏通铁路通车2个月,对海门人的生活改变了吗?
  3. linux read函数段错误,linux C++ 莫名奇异的段错误(segmentation fault),无法调用其他函数...
  4. 故事的小黄花,从CSDN那年就飘着
  5. 是否允许此网站打开你计算机上的程序
  6. cesium 加载科技感
  7. idea DataGrip 使用图解教程
  8. Mysql 删除数据表的三种方式详解
  9. @RequestParam注解用法
  10. oracle时间去掉时分秒的时间_超详细的oracle修改AWR采样时间间隔和快照保留时间教程...