鱼C论坛

 找回密码
 立即注册
查看: 2666|回复: 0

[学习笔记] 琢石成器WIN32汇编程序设计学习(一)-第4章 第一个窗口程序(一)

[复制链接]
发表于 2018-3-12 16:04:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 兰陵月 于 2018-3-12 16:15 编辑

第4章  第一个窗口程序
4.1  开始了解窗口
4.1.1  窗口是什么
    1.使用窗口的原因
    Windows是多任务的操作系统,可以同时运行多个程序,同样,各个程序在屏幕上的显示不能互相干扰,而且,过个程序可以看成是“同时”运行的,在后台的程序也可能随时向屏幕输出内容,这中间的调度是Windows完成的。Windows采用的方法是给程序一块矩形的屏幕空间,这就是窗口。
    2.窗口和程序的关系
    一个窗口不一定就是一个程序,它可能只是一个程序的一部分。一个程序可以建立多个顶层窗口,如Windows的桌面和任务栏都是顶层窗口,但它们都属于“文件管理器”进程,所以并不是一个窗口就是一个程序的代表
    反过来,运行的程序并非一定就是窗口,比如悄悄在后台运行的木马程序就不会显示一个窗口向用户报告它在干非法勾当。在Windows NT下用“任务管理器”查看,进程的数量比屏幕上的窗口多得多,意味着很多的运行程序并没有显示窗口。如果一个程序不想和用户交互,它可以选择不建立窗口。
    虽然以窗口为界面的程序并不是所有Windows程序的必然选择,但绝大部分的应用程序是以这种方式出现的,从操作系统的名称“Windows”就可以看出这一点,了解窗口程序就是相当于在了解Windows工作方式的基础。
4.1.2  窗口界面
    窗口一般由屏幕上的矩形区域组成,不同的窗口可能包括一些相同的组成部分,如标题栏、菜单、工具栏、边框和状态栏等,每个部分都有自己固定的行为模式:
    窗口边框—窗口的外沿就是窗口边框,用鼠标按住边框并拖动可以调整窗口的大小。
    标题栏—窗口的最上面就是标题栏,用鼠标按住标题栏拖动可移动窗口,双击标题栏则将窗口最大化或从最大化的状态恢复。通过标题栏的颜色可以区分窗口是不是活动窗口,同时标题栏列出了应用程序的名称。
    菜单—标题栏下面的是菜单,单击菜单会弹出各种功能选择。
    工具栏—菜单的下面是工具栏,工具栏上用图标的方式列出最常用的功能,相当于菜单的快捷方式。
    图标和“最小化”、“最大化”与“关闭”按钮—图标位于标题栏的左边,三个控制按钮则位于标题栏的右边。单击图标会弹出一个系统菜单,双击图标则相当于按下了“关闭”按钮。“最小化”、“最大化”按钮用来控制窗口的大小。
    状态栏—状态栏位于窗口的最下面,用来显示一些状态信息。
    客户区—窗口中间用来工作或输出的区域叫做窗口的客户区,把窗口看做是一张白纸的话,客户区就是白纸中真正用来书写的部分,程序在这里和用户进行交互。
    滚动条—如果客户区太小不足于显示全部内容,则右边或底部可能还有滚动条,拖动它可以滚动窗口的客户区,以便看到其他的内容。
001.png

    当然并不是所有的窗口都是这个样子,有些窗口就没有图标和最小化、最大化框,有的没有工具栏或状态栏,有的没有 标题栏,而有的就干脆是个奇怪的形状,就连屏幕保护程序的黑屏幕也是一个大小为整个屏幕、没有标题栏和边框的窗口!
    一致的窗口形状和行为模式为Windows用户提供了一致的用户界面,几乎所有的窗口程序都在菜单的第一栏设置有关文件的操作和退出功能、最后一栏设置程序的帮助,相同的功能在工具栏上的图标也是大同小异,用户可以不再像在DOS下那样,对不同的程序需要学习不同的界面,用户自从学会使用第一个软件起,就基本学会了所有Windows软件的使用模式,而且可以通过相似的菜单、工具栏等来发掘程序的新功能。窗口的菜单和客户区是最个性化的部分,菜单随程序功能的不同而不同,而客户区则是窗口程序的输出区域,不同的程序在客户区内显示了不同的内容。
4.1.3  窗口程序是怎么工作的
    1.窗口程序的运行模式
    DOS程序员熟悉的是顺序化的、按过程驱动的程序设计方法,这种程序有明显的开始、明显的过程和明显的结束,由程序运行的阶段来决定用户该做什么。
    而窗口程序是事件驱动,用户可能随时发出各种消息,如操作的过程中觉得窗口不够大了,就马上拖动边框,程序必须马上调整客户区的内容以适应新的窗口大小;用户觉得想先干别的事情,可能会把窗口最小,“关闭”按钮也有可能随时被按下,这意味着程序要随时可以处理退出的请求。如果非要规定干活的时候不能移动窗口与调整大小,那么这些窗口就会呆在桌面上一动不动。
    再次提醒:这里是“窗口程序”而不是“Windows程序”,因为和窗口有关的程序才是事件驱动的,其他的Windows可能并不这样工作,如控制台程序的结构还是同DOS程序一样是顺序化的,但与窗口相关的Windows程序占了绝大多数,所以大部分书籍中讲到Windows程序就认为是事件驱动的程序。
    窗口程序实现大部分功能的代码应该呆在同一个模块—“消息处理”模块中,这个模块可以随时应付所有类型的消息,只有这样才能随时响应用户的各种操作
    2.FirstWindow源代码
    程序的结构:入口是start,然后执行了一个_WinMain子程序,完成后就是程序退出的函数ExitProcess,再看_WinMain的结构,前面是顺序下来的几个API:GetModuleHandle->RtlZeroMemory->
LoadCursor->RegisterClassEx->CreateWindowEx->ShowWindow->
UpdateWindow。
    很明显,窗口是在CreateWindowEx处建立的,ShowWindow则是把窗口显示在屏幕上,这些代码是窗口的建立过程。接下来就是一个由3个API组成的循环:GetMessage->TranslateMessage->DispatchMessage。很明显,这是与消息有关的循环,因为API名称中都带有Message字样,如果退出这个循环,程序也就结束了,这个循环叫做消息循环。设置_WinMain子程序并不是必需的,可以把_WinMain的所有代码放到主程序中,没有任何影响,之所以这样,只是为了将这里使用的变量定义成局部变量,这样可以方便移植。
    还有一个子程序_ProcWinMain,但除了在WNDCLASSEX结构的赋值中提到过它,貌似其他地方用了这个子程序,起码在自己编写的源代码中没有任何一个地方调用过它。
    _ProcWinMain是一个分支结构处理的子程序,功能是把参数uMsg取出来,根据不同的uMsg执行不同的代码,完了以后就退出了,中间也没有任何代码和主程序有关联。
    3.窗口程序的运行过程
    在屏幕上显示一个窗口的过程一般有以下步骤,也是主程序的结构流程:
    (1)得到应用程序的句柄(GetModuleHandle)
    (2)注册窗口类(RegisterClassEx)。在注册之前,要先填写RegisterClassEx的参数WNDCLASSEX结构。
    (3)建立窗口(CreateWindowEx)
    (4)显示窗口(ShowWindow)
    (5)刷新窗口客户区(UpdateWindow)
    (6)进入无限的消息获取和处理的循环。首先获取消息(GetMessage),如果有消息到达,则将消息分派到回调函数处理(DispatchMessage),如果消息是WM_QUIT,则退出循环。
    程序的另一半_ProcWinMain子程序是用来处理消息的,它就是窗口的回调函数(Callback),也叫作窗口过程,之所以是回调函数,是因为它是由Windows而不是我们自己调用的,我们调用DispatchMessage,而DispatchMessage在自己的内部回过来调用窗口过程。
    所有的用户操作都是通过消息来传给应用程序的,如用户按键、鼠标移动、选择了菜单和拖动了窗口等,应用程序中由窗口过程接收消息并处理,在例子程序中就是_ProcWinMain。由于窗口过程构造了一个分支结构,对应不同的消息执行不同的代码,所以一个应用程序中几乎所有的功能代码都集中在窗口过程里。
    Windows内部有一个系统消息队列,当输入设备有所动作时,如用户按动了键盘、移动了鼠标、按下或者放开了鼠标等,Windows都会产生相应的记录放在系统消息队列里,如图4.4中的箭头a和箭头b所示,每个记录包含消息的类型、发生的位置(如鼠标在什么位置移动)和发生的时间等信息。
002.png
    同时,Windows为每个程序(严格地说是每个线程)维护一个消息队列,Windows检查系统消息队列里消息的发生位置,当位置位于某个应用程序的窗口范围内的时候,就把这个消息派送到应用程序的消息队列里,如图4.4中的箭头c所示。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
╰☆忝婲雨☆╮ + 1 + 1 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-6 07:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表