1. Window概述
1.1 Desktop Window: 操作系统启动时自动创建的窗口,是所有应用程序窗口的基础。
1.2 Application Windows:用户和应用程序交互的接口。每个图形界面程序启动时,至少创建一个主窗口。Application Windows又分为客户区和非客户区。
1.2.1 非客户区由系统管理,包括title bar, menu bar, window menu, minimize and maximize buttons, sizing border, and scroll bars,
1.2.2 客户区由应用程序管理,用于显示图形和文字信息。
1.3 Controls: 一种子窗口(Child Windows),一般联合其它类型的Window完成简单的输入输出任务。一般用于Dialog Box,但也能和其它window类型配合。常用的Controls有:Button, Edit, Static, Combo Box等。
1.4 Dialog Boxes: 一种包含一个或多个Controls控件的Window,一般是临时窗口,用于接受用户信息。和Application Windows的主要区别在于,一般没有menu bar, minimize and maximize buttons和scroll bars.
Dialog有为两种,DialogBox() API创建一个modal dialog box,而CreateDialog()创建一个modeless dialog box。正常情况下,Dialog必须要有父窗口;虽然不指定父窗口也能运行,但由于跟程序的其它窗口没有派生关系,很容易引起问题。
2. 创建window
2.1 注册window class (RegisterClassEx() )。主要负责指明消息处理函数,窗体风格等
2.1.1 window class类型。分为系统,全局以及局部类型。Windows查找一个window class时,优先在局部列表里找,其次在全局列表里找,最后才在系统列表里找。
2.1.1.1 系统类型(System Classes)是指系统已经注册好了的window class,任何应用程序可以直接拿来使用, 如Button, ComboBox 和 Edit等。
2.1.1.2 全局类型(Application Global Classes)是指在一个process范围内所有模块都可以使用 的window class
2.1.1.3 局部类型(Application Local Classes)是指模块自己内部使用的window class
2.2 创建window (CreateWindowEx() )。使用window class 创建window, 指明一些附加属性,如边框类型等。
2.3 如果需要动态改变一个window instance的属性,调用SetWindowLong()来设置各项属性,甚至可以改变该window的消息处理函数,这称为subclassing.
2.4 处理消息循环
2.5 销毁window (DestroyWindow() ).
3. Window类型
在调用 CreateWindowEx()函数时给dwStyle设置合适的值
3.1 Overlapped Windows: 一种 "top-level"的窗口, 通常用作应用程序的主窗口。
基本风格: title bar, border, and client area (WS_OVERLAPPED)
可选风格: window menu, minimize and maximize buttons, and scroll bars(WS_OVERLAPPEDWINDOW)
3.2 Pop-up Windows: 一种特殊类型的“Overlapped Windows”,常用于"dialog boxes", " message boxes"以及其它临时窗口,这种窗口的特点是可以在主窗口区域之外显示。
基本风格: border and client area(WS_POPUP)
可选风格2: Title bars(WS_CAPTION), 这种情况下,和带(WS_OVERLAPPED)标志的"Overlapped Windows"完全一样。
可选风格2: border and window menu(WS_POPUPWINDOW),必须和(WS_CAPTION)合并使用.
3.3 Child Windows: 受限于父窗口的客户区(client area)的一种窗口,一般用于把父窗口的客服区划分为几个子功能区。Child Windows的父窗口可以是一个overlapped window, 一个pop-up
window, 或另外一个child window。Child Window必须有父窗口。
基本风格:不带任何窗口元素(WS_CHILD)
可选风格: 合并title bar(WS_CAPTION), minimize and maximize buttons(WS_MINIMIZEBOX and WS_MAXIMIZEBOX) , border(WS_BORDER), and scroll bars(WS_HSCROLL or WS_VSCROLL)
子窗口的几个重要属性:
3.3.1 子窗口的坐标原点是父窗口的左上角位置,且子窗口超出父窗口客户区的部分不会被显示
3.3.2 父窗口的Hidden, Shown,Move 和 Destroy事件会自动影响子窗口。例如,在父窗口Destory之前,所有的子窗口会被自动Destory
3.3.3 父窗口交出一部分客户区给子窗口,在这些区域上发生的消息事件,系统绕过父窗口直接发送给子窗口。唯一的例外是子窗口被disable了,这时所有子窗口的消息被发给父窗口。
3.3.4 子窗口可以有一个用户定义的唯一ID。这在使用control windows时特别有用,程序通过ID和control windows的子窗口进行消息交互。
3.4 其它特色窗口类型
3.4.1 Layered Windows: 一种主窗口,由系统自动管理窗口之间的叠层关系,减少重绘次数,提高性能。
3.4.2 Message-Only Windows: 一种不可见的窗口,只用于消息循环。
4. Windows的主从关系(Owned window and Owner window)
主从关系(Owner/Owener)和派生关系(Parent/Child)有些相似,但是两种不同的关系。
4.1 只有Overlapped Window或Pop-up Window能当主窗口(Owner window),Child Windows不行。窗口的主从关系是在调用CreateWindowEx()时通过hwndParent参数指定的。如果父窗口也是个Child Windows,则窗口的所有权被指定为该父窗口的主窗口(Owner window).
4.2 有主从关系的windows有下列一些约束:
4.2.1 在Z-order关系上,从窗口(owned window)永远在主窗口(owner window)之上
4.2.2 当主窗口销毁时,从窗口自动销毁
4.2.3 当主窗口最小化时,从窗口自动隐藏
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment