关于窗口

 

在编写Windows程序之前必须先认识窗口的概念。虽然自己在使用Windows已经很熟悉了,但是还是要确定以下Windows的每个概念的意义,这样对以后的变成会有很大的帮助。下面会就在Windows系统中应用程序如何创建、使用、显示、移动窗口。以及窗口之间的关系的一些概念作一个比较详细的描述。


下面的描述包含了下列主题



桌面窗口(Desktop Window)


启动windows系统,它就会自动创建桌面窗口。桌面窗口是系统定义的窗口,这个窗口绘制了屏幕的背景.作为Windows应用程序显示窗口的基础。



桌面窗口使用了存放在位图文件(扩展名是.BMP)中的一个位图来绘制屏幕的背景,由这个位图所创建的图案被称为桌面壁纸。


在需要的情况下可以通过 GetDesktopWindow 函数来返回桌面窗口的句柄。


(应用窗口)Application Windows


    
每一个Windows应用程序至少要创建一个窗口,称之为主窗口,作为应用程序的主窗口,这个窗口是用户与应用程序之间的主要接口。绝大部分应用程序还会直接或间接地创建许多其它的窗口,来完成与主窗口有关的任务,每一个窗口都是用来显示输出或是从用户得到输入。


    
当启动一个应用程序后,系统会为这个应用程序创建一个任务按钮,这个任务按钮包含了一个程序图标和该应用程序窗口的标题名称当应用程序是出于活动状态时,任务按钮会显示成压下的状态。


典型应用程序窗口的组成



应用程序窗口一般是由标题栏、菜单栏、窗口菜单(也叫System菜单)、最小按钮、最大按钮、恢复按钮、关闭按钮、改变大小的边框、客户区、水平滚动条和垂直滚动条等组成。应用程序主窗口通常含有上面列出的所有成员,下图是一个典型主窗口的组成情况



典型的窗口


客户区(Client Area)



客户区是整个窗口区域的一部分,应用程序可以在这个区域里输出文字或图形信息,比如一个有关桌面排版的应用程序就会在客户区内显示文档的当前页面。应用程序必须提供一个函数,这个函数被称为窗口函数,该函数用来处理输入到该窗口的数据和在客户区中显示该窗口需要输出的信息。了解更多的信息参考“窗口函数”


非客户区(Nonclient Area)



窗口的非客户区包括窗口的标题栏、菜单栏、窗口菜单(也叫System菜单)、最小按钮、最大按钮、恢复按钮、关闭按钮、改变大小的边框、水平滚动条和垂直滚动条组成。系统管理非客户区的外观,而应用程序负责管理客户区的外观和行为。


窗口的标题栏显示应用程序定义的图标和一行文字,通过图标和窗口文字用户可以区分不同的应用程序,在创建一个窗口的时候,我们可以指定窗口的图标和窗口文字,标题栏的另一个作用就是可以让用户通过鼠标或者其他的定点设备来移动某个窗口的位置。



许多应用程序包含一个菜单栏,在菜单栏内列出了应用程序所提供的命令。菜单条中的各项描述了主菜单中命令的分类,在主菜单中点击某一项一般会弹出一个下拉菜单,而每个菜单项表示应用程序需要执行的具体任务。用户可以通过点击某个菜单项来指挥应用程序执行相应的任务。


当一个窗口建立起来的时候,系统会为该窗口建立一个窗口菜单(也叫System菜单),它包含了系统提供的标准的菜单项。如:移动、关闭。


在窗口右上角的按钮中包含三个按钮(最小化、最大化/还原、关闭)其中最小化、最大化/还原这两个按钮会影响窗口的位置。当用户点按最大化按钮时,系统将调整窗口到屏幕的最大尺寸。同时将最大化按钮设置为还原按钮。


改变大小的边框是一个围绕作窗口边界的一个区域,通过这个区域用户可以通过鼠标或其他定点输入设备调整窗口的尺寸。


水平滚动条和垂直滚动条的作用是将用户由键盘或鼠标所输入的信息输入到应用程序,在由应用程序来控制客户区正文的水平移动或垂直移动。


控件和对话框(Controls and Dialog Boxes


控制框是应用程序用来获得用户特定信息的窗口,比如:要打开文件的名字或是正文选择中有关点的尺寸的设置。应用程序也会通过控制框获取所需要的信息,以便控制应用程序的某种特性。例如,字处理应用程序通常提供的一个控制,让用户设置自动换行特性的开或关。


控制框总是要与其它窗口连用的,典型的是对话框。对话框是一个含有一个或多个控制框的窗口。应用程序可通过对话框提示用户提供完成某一个命令所需的输入。例如,含有打开文件命令的应用程序,就得显示一个对话框,其中的控制框让用户指定路径或文件名。


消息框是一种特殊类型的对话框,用于给用户一些提示或警告的窗口。例如,消息框能够在应用程序完成某项任务过程中出现问题时通知用户。


窗口属性(Window Attributes


应用程序在创建窗口时必须提供下列信息。 (窗口的创建函数会见这些信息加以确认,并返回一个包含指定信息的窗口句柄来标示刚才创建的窗口)



下面对这些属性进行一一说明


窗口类名(Class Name)


窗口类
每一个窗口都从属于某一窗口类,应用程序必须在创建某类窗口之前注册窗口类,窗口类定义子窗口的外观和特性。窗口类的主要部分是一个窗口过程,也就是接收和处理给窗口的输入和请求的函数,Windows系统以消息的形式给窗口提供输入或请求


窗口名(Window Name)


窗口可以有一个名字,窗口名(也叫窗口正文)是便于用户识别一个窗口的正文字符串。主窗口、对话框或消息框一般是在其标题栏上显示窗口名。而对于控制,窗口名的外观取决于控制的类。按钮、编辑控制或静态控制是在控制所占据的矩形框内显示其窗口名;列表框、组合框或静态控制则不显示其窗口名。


应用程序在创建窗口以后可用函数SetWindowText来改变窗口名,通过函数GetWindowTextLength和GetWindowText来检取当前窗口名的正文。


窗口的基本风格(Window Style)


每个窗口都有一个或几个窗口风格,窗口风格是一个命名的常量,可以指定在定义窗口类时没有指定的窗口外观及特性。应用程序通常在创建窗口的时候必须指定窗口风格,如果需要更改一个已经创建好的窗口的风格可以使用SetWindowLong
函数。普通的窗口风格一般由WS_前缀表示。可以通过“OR”操作将不同的风格进行组合使用。


窗口的扩展风格(Extended Window Style)


和基本风格一样,每个窗口都可以拥有有一个或几个窗口的扩展风格,窗口扩展风格也是一个命名的常量,可以指定在定义窗口类时没有指定的窗口外观及特性。如果需要更改一个已经穿建好的窗口的风格可以使用SetWindowLong
函数。


窗口位置(Position)


窗口的位置是出它左上角的坐标决定的,这些坐标有时叫做窗口坐标,总是相对于屏幕的左上角,对于子窗口来说,则是相对于其父窗口客户区的左上角。例如,某个顶层窗口的坐标是(10,10),那么它就被定位在屏幕左上角向右10个象素,向下10个象素的位置。如果一个子窗口的坐标是(10,10)。那么它就被定位在其父窗口客户区左上角向右10个象素向下10个象素的位置。
函数WindowFromPoint用来检取占取屏幕上某一点的窗口的句柄,函数ChildWindowFromPoint则用来检取占取父窗口客户区中某一点的子窗口的句柄。


窗口尺寸(Size)


窗口的尺寸(宽和高)是以象素为单位的,一个窗口的高度和宽度都可以为0,如果应用程序把某个窗口的高度和宽度都置成0,Windows系统就把尺寸置成默认的最小窗口尺寸。


应用程序是通过带有SM_CXMIN和SM_CYMIN标志的函数GetSystemMetrics来获取最小窗口的默认尺寸的。
应用程序可能要创建具有一定尺寸的客户区的窗口,函数AdjuestWindowRect和AdjuestWindowRectEx可根据所设计的客户区尺寸来计算所需窗口的尺寸应用程序再把计算结果传给函数CreateWindowEx。


应用程序可把窗口的尺寸改变得很大,但最好不要超过屏幕的大小。在设置窗口的尺寸之前,应用程序应该用带有SM_CXSCREEN和SM_CYSCREEN标志的函数GetSystMetrics来检查屏幕的宽度和高度。


窗口的父窗口或属主窗口(Parent or Owner Window Handle)


窗口可以有一个父窗口,有父窗口的窗口称之为子窗口,由父窗口提供的坐标系统对子窗口进行定位。父窗口会影响窗口的外观,例如,如果一个子窗口被裁剪,那么子窗口就不会超出其父窗口的边框。如果一个窗口没有父窗口或是父窗口就是桌面窗口,那么就叫做顶层窗口。应用程序通过函数EnumWindows来获取它的每一个顶层窗口的句柄,再由EnumWindows把每一个顶层窗口的句柄传给应用程序定义的回调函数(由Windows系统调用的函数)。


一个窗口可以拥有别的窗口,或者被别的窗口所拥有。被拥有的窗口总是在其属主窗口的前面,它的属主窗口被最小化时隐藏起来,并随同主窗口的销毁而销毁。


菜单句柄或表示子窗口的ID号(Menu Handle or Child-Window Identifier)


子窗口可以有一个子窗口标识,它是由应用程序定义的对应于该子窗口的一个唯一的值。子窗口标识对创建多个子窗口的应用程序来说是特别有用的。创建一个子窗口时,应用程序就为它设置一个子窗口标识,创建子窗口之后,可通过函数SetWtndowLong来改变窗口标识,或是用函数GetWindowLong检取标识。


除了子窗口,每个窗口都能有一个菜单,应用程序是在注册窗口类或创建窗口时过提供一个菜单句柄来产生菜单。


应用程序实例句柄(Application Instance Handle)


每个Windows应用程序都有一个与之相应的实例句柄,Windows系统在应用程序开始的时候就为它提供了实例句柄。因为同一个应用程序可以有多个拷贝,Windows系统就是利用实例句柄来区分应用程序的不同实例。应用程序必须为不同的窗口指定实例句柄,包括那些创建窗口的实例。


创建数据(Creation Data)


每个窗口都可有与之相应的由应用程序定义的创建数据。在窗口第一次被创建时Windows系统把数据的指针传给所创建窗口的窗口过程,窗口过程用这些数据初始化应用程序定义的变量。


窗口句柄(Window Handle)


创建子窗口之后。创建函数返回唯一标识窗口的窗口句柄,应用程序在其它函数中用这个句柄以确保是对该窗口的操作。窗口句柄属于HWND数据类型,应用程序必须在说明一个窗口句柄的变量时使用这种类型。


Windows系统还有另外几个专用的常量,在某些函数中可用来代替窗口句柄,这些常量以HWND_作为前缀。例如,可在函数SetWindowPos中用HWND_TOP和HWND_B0TTOM常量把窗口移到Z次序的顶部或底部。


尽管常量NULL不是一个窗口句柄,但应用程序可在一些函数中用它来表明没有窗口受到影响。例如,把函数CreateWindowEx的hwndParent参数置成NULL,那么所创建的窗口就没有父窗口或属主窗口。有些函数可能返回NULL而不是一个句柄,表示给定的操作没有施加给任何窗口。
应用程序可以用函数FindWindow来确定系统中是否有指定类名或窗口名的窗口,如果有这样的窗口,FindWindow就返回这个窗口的句柄。函数IsWindow确定一个窗口句柄是否标识一个有效的、存在的窗口。


创建窗口(Window Creation)


应用程序可以通过函数CreateWindow或CreateWindowEx来创建它的主窗口,并提供Windows系统定义窗口属性所需的信息。函数CreateWindowEx有一个参数dwExStyLe,函数CreateWindow则没有;换句话说这两个函数是等同的,CreateWindow只是简单地调用了CreateWindowEx把参数dwExstde置成0,基于这个原因,下面所涉及到的只是函数CreateWindowEx。


接下来包含下列主体



Main Window Creation


每个Windows应用程序都得用WinMain作为入口,函数WinMain完成一系列工作,包括注册主窗口的窗口类并创建主窗口。WinMain调用函数RegisterClass,注册主窗口类,函数CreateWindowEx创建主窗口。


Windows系统创建了主窗口之后不会自动显示它,应用程序必须调用函数ShowWindow来显示主窗口。通常应用程序的WinMain函数在创建了主窗口之后就调用ShowWindow函数,WinMain把两个参数传给ShowWindow:主窗口的句柄以及一个决定主窗口在第一次被显示时是最小化还是最大化的标志,一般来说,这个标志可以是Windows系统头文件中定义的以SW作为前缀的任何常量,但是如果是调用ShowWindow
来显示应用程序的主窗口,那么这个标志必须设置成SW_SHOWDEFAULT,这个标志通知Windows系统,要根据启动应用程序的程序来显示窗口。


Window-Creation Messages


创建任何窗口,Windows系统都要向窗口的窗口过程发送消息。Windows系统创建子窗口的非客户区后要发送WM_NCCREATE消息,创建了客户区后则需发送WM_CREATE消息。窗口过程在Windows系统显示窗口之前接收这两种消息,这两种消息都含有结构CREATESTRUCT的指针,该结构中含有函数CreateWindowEx中指定的所有信息。通常窗口过程根据接收到的消息完成初始化工作。


如果创建一个子窗口Windows系统在发送了WM_NCCREATE和WM_CREATE消息之后,还要给父窗口发送WM_PARENTNOTIFY消息。在创建窗口的时候还可能会发送其它的消息,消息的数目和次序要由窗口类及风格以及用于创建窗口的函数来确定。在后面的有关章节中讲解了这些消息。


Multithread Applications


Windows
应用程序可以运行多个线程,每一个线程都可以创建窗口。应用程序可通过函数EnumThreadWindow统计由某一个线程所创建的窗口,这个函数再把每个线程窗口的句柄传给应用程序定义的回调函数。
函数GetWindowThreadProcessId返回创建某个窗口的线程的标识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值