按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
窗口一般由屏幕上的矩形区域组成,不同的窗口可能包括一些相同的组成部分,如标题栏、菜单、工具栏、边框和状态栏等,每个部分都有自己固定的行为模式:
● 窗口边框——窗口的外沿就是窗口边框,用鼠标按住边框并拖动可以调整窗口的大小。
● 标题栏——窗口的最上面是标题栏,用鼠标按住标题栏拖动可移动窗口,双击标题栏则将窗口最大化或从最大化的状态恢复。通过标题栏的颜色可以区分窗口是不是活动窗口,同时标题栏列出了应用程序的名称。
● 菜单——标题栏下面是菜单,单击菜单会弹出各种功能选择。
● 工具栏——菜单的下面是工具栏,工具栏上用图标的方式列出最常用的功能,相当于菜单的快捷方式。
● 图标和“最小化”、“最大化”与“关闭”按钮——图标位于标题栏的左边,三个控制按钮则位于标题栏的右边。单击图标会弹出一个系统菜单,双击图标则相当于按下了“关闭”按钮。“最小化”、“最大化”按钮用来控制窗口的大小。
● 状态栏——状态栏位于窗口的最下面,用来显示一些状态信息。
● 客户区——窗口中间用来工作或输出的区域,叫做窗口的客户区,把窗口看做是一张白纸的话,客户区就是白纸中真正用来写东西的部分,程序在这里和用户进行交互。
● 滚动条——如果客户区太小不足于显示全部内容,右边或底部可能还有滚动条,拖动它可以滚动窗口的客户区,以便看到其他的内容。
虽然大部分窗口看上去都差不多,但并不是每个窗口都有这些东西,也许有的窗口就没有图标和最小化、最大化框,有的没有工具栏或状态栏,有的没有标题栏,而有的就干脆是个奇怪的形状,如Office帮助中的助手,那些小狗小猫都是些不折不扣的窗口,Windows的桌面和桌面下面的任务栏也都是窗口,就连屏幕保护的黑屏幕也是一个大小为整个屏幕、没有标题栏和边框的窗口!
一致的窗口形状和行为模式为Windows用户提供了一致的用户界面,几乎所有的窗口程序都在菜单的第一栏设置有关文件的操作和退出功能、最后一栏设置程序的帮助,相同的功能在工具栏上的图标也是大同小异的,用户可以不再像在DOS下那样,对不同的程序需要学习不同的界面,用户自从学会使用第一个软件起,就基本学会了所有Windows软件的使用模式,而且可以通过相似的菜单、工具栏等来发掘程序的新功能。窗口的菜单和客户区则是最个性化的东西,菜单随程序功能的不同而不同,而客户区则是窗口程序的输出区域,不同的程序在客户区内显示了不同的内容。
4。1。3 窗口程序是怎么工作的
1。 窗口程序的运行模式
对程序员来说,要了解的不仅是用户可以看到的部分,还必须了解窗口底下的东西,了解用怎样的程序结构来实现窗口的行为模式。
DOS程序员熟悉的是顺序化的、按过程驱动的程序设计方法。程序有明显的开始、明显的过程和明显的结束,由程序运行的阶段来决定用户该做什么。而窗口程序是事件驱动的(再次提醒:这里是“窗口程序”而不是“Windows程序”,因为和窗口有关的程序才是事件驱动的,其他的Windows可能并不这样工作,如控制台程序的结构还是同DOS程序一样是顺序化的,但与窗口相关的Windows程序占了绝大多数,所以大部分的书籍中讲到Windows程序就认为是事件驱动的程序),用户可能随时发出各种消息,如操作的过程中觉得窗口不够大了,就马上会拖动边框,程序必须马上调整客户区的内容以适应新的窗口大小;用户觉得想先干别的事情,可能会把窗口最小化,关闭按钮也有可能随时被按下,这意味着程序要随时可以处理退出的请求。如果非要规定干活的时候不能移动窗口与调整大小,那么这些窗口就会呆在桌面上一动不动。
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第4章 第一个窗口程序
4。1 开始了解窗口(2)
先通过一个简单的例子来说明两种程序设计方式的不同,以DOS下的文件比较命令p为例,程序运行时先提示输入第一个文件名,然后是输入第二个文件名,程序比较后退出,同时把结果输出在屏幕上。假如有一个窗口版的p程序,那么运行时会在屏幕上出现一个对话框,上面有两个文本框用来输入两个文件名,还会有个“比较”按钮,按下后开始比较文件,用户可以随时按下“关闭”按钮来退出程序。
两种程序的运行会有相当大的不同,如图4。2所示,DOS程序必须按照顺序运行,当运行到输入第二个文件名时,用户不可能回到第一步修改第一个文件名,这时候用户也不能退出(除非用户强制用Ctrl+C键,但这不是程序的本意);而在窗口程序中用户可以随意选择先输入哪个文件名,同时也可以对窗口进行各种操作,当用户做任何一个操作的时候,相当于发出了一个消息,这些消息没有任何顺序关系,程序中必须随时准备处理不同的消息。
图4。2 不同的程序结构模式
这就决定了窗口程序必定在结构上和DOS程序有很大的不同,窗口程序实现大部分功能的代码应该呆在同一个模块——图中的“消息处理”模块中,这个模块可以随时应付所有类型的消息,只有这样才能随时响应用户的各种操作。
下面先来看一个地地道道的Win32汇编窗口程序。
2。 FirstWindow源代码
读者可以在所带光盘的Chapter04FirstWindow目录中找到源代码,目录里面有两个文件,它们是汇编源文件FirstWindow。asm和nmake工具使用的makefile,汇编源程序如下:
。386
。model flat;stdcall
option 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 ?
nst
szClassName db 'MyClass';0
szCaptionMain db 'My first Window !';0
szText db 'Win32 Assembly; Simple and powerful !';0
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 代码段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
de
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 窗口过程
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_ProcWinMain proc uses ebx edi esi;hWnd;uMsg;wParam;lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
mov eax;uMsg
;********************************************************************
。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
;********************************************************************
。elseif eax WM_CLOSE
invoke DestroyWindow;hWinMain
invoke PostQuitMessage;NULL
;********************************************************************
。else
invoke DefWindowProc;hWnd;uMsg;wParam;lParam
ret
。endif
;********************************************************************
xor eax;eax
ret
_ProcWinMain endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG