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 当主窗口最小化时,从窗口自动隐藏
Showing posts with label GUI. Show all posts
Showing posts with label GUI. Show all posts
Sunday, September 19, 2010
Thursday, August 19, 2010
notus
1.简介。
http://notus.sourceforge.net/
notus是win32下的一个轻量GUI库,依赖c++ template技术,实现Model-Strategies-View模型。
优点:1) 轻量,高效。大量使用template技术,直接调用平台native的GUI实现。
2) 理论上说,可以有很强的可移植性。
缺点:1) 缺乏维护,多年未有更新。一些基本操作没有很好封装,显得繁琐。
2) 对GUI模型的抽象度不是特别的好,对Win32有过强的依赖。
2. 的模块结构
3.view的组成。一个view是由一个Display,一个Strategies组以及一个model_controller组成。
4. Strategies的构成。strategies是由boost::tuple组成的一个strategy集合,当收到event时,遍历该集合,调用适当strategy。遍历过程是编译时处理的,不影响运行时速度。
5. Display中可用的组件。这些组件都是抽象的接口,依赖于impl包中对于不同平台的具体实现。由于直接使用平台相关的native implementation,所以程序效率很高。
6. 典型的消息过程
http://notus.sourceforge.net/
notus是win32下的一个轻量GUI库,依赖c++ template技术,实现Model-Strategies-View模型。
优点:1) 轻量,高效。大量使用template技术,直接调用平台native的GUI实现。
2) 理论上说,可以有很强的可移植性。
缺点:1) 缺乏维护,多年未有更新。一些基本操作没有很好封装,显得繁琐。
2) 对GUI模型的抽象度不是特别的好,对Win32有过强的依赖。
2. 的模块结构
3.view的组成。一个view是由一个Display,一个Strategies组以及一个model_controller组成。
4. Strategies的构成。strategies是由boost::tuple组成的一个strategy集合,当收到event时,遍历该集合,调用适当strategy。遍历过程是编译时处理的,不影响运行时速度。
5. Display中可用的组件。这些组件都是抽象的接口,依赖于impl包中对于不同平台的具体实现。由于直接使用平台相关的native implementation,所以程序效率很高。
6. 典型的消息过程
Subscribe to:
Posts (Atom)





