代码改变世界

10 插件系统设计 (终章)

2013-05-18 01:18 by 浪客倩心, 1894 阅读, 0 推荐, 收藏,
摘要:10 插件系统设计本章作为终章将模仿Windosw8的开始屏幕设计一个插件系统,插件将由UI、业务逻辑组成。10.1 UI插件的可行性插件被编译为dll,被主程序载入的dll将拥有自己独立的栈空间。UI主程序将拥有一套GXUI框架对象(包括UIDXInit、UIAnimateManage、UIMessageLoopManage、UICamera、UIRender、UIWinShell),如果插件包括UI,那么该插件中也将包含一套GXUI框架对象,这样会产生冲突。为解决该冲突,设计中将已主程序的GXUI框架对象为主,并引用到UI插件中。具体实现方式为,在框架对象中添加一个引用赋值函数,已类UIA 阅读全文

9 控件布局

2013-05-09 18:43 by 浪客倩心, 919 阅读, 0 推荐, 收藏,
摘要:9 控件布局控件布局主要起二个作用:1)空间充分利用;2)自动计算,排列美观;9.1 UITab标签UITab依旧设计为控件,其设计目标如下:1) 已标签的方式管理多个窗口,分为标签栏与窗口空间;2) 标签栏方向支持x轴和y轴;3) 切换标签时支持动画效果;4) 标签栏可以隐藏;5) 子窗口传递给UITab的通告消息能被继续传给UITab的父窗口;对于第5点目标,将透射子窗口消息标志置true,参与透射的消息一般为通告,滚动条消息,具体的消息处理过程添加到函数DefHandleMessage()中,代码如下。bool UIWinBase::DefHandleMessage( …… ){ // 阅读全文

8 控件设计

2013-05-04 17:14 by 浪客倩心, 1433 阅读, 1 推荐, 收藏,
摘要:8 控件设计 一个UI框架需包含大量UI Widget来获得实用价值,而其中大部分表现为控件,还有部分的窗口部件等。8.1 资源DLL GXUI库作为一个GUI库,大部分控件会用到默认的图片资源,将这些资源封装到一个默认的dll中供程序调用。 文件夹Resource包含了所需要的文件资源,GXUI库通过建立工程GUIResource来生成命名为GUIResource.dll的资源dll。工程中的图片文件都是手动添加编辑,其中文件resource.h中定义的图片ID将被添加到GXUI库的UIUtil.h/cpp中,而资源文件GUIResource.rc中对默认支持的BMP文件类型标记为BITMA 阅读全文

7 动画效果

2013-04-12 10:05 by 浪客倩心, 616 阅读, 0 推荐, 收藏,
摘要:7 动画效果 一个生动的UI需要动画效果支持,同时某些特定的界面元素本身也需要动画效果,比如插入符的闪烁效果也可被归纳入动画。7.1 动画基类与动画管理类7.1.1 动画家基类 定义的动画基类代码如下: struct UIAnimateBase{ friend class UIAnimateManage; virtual void Init() {} // 初始化 virtual void Uninit() {} // virtual bool IsRun() = 0; // 动画是否运行 virtual bool IsDrawFrame() = 0; /... 阅读全文

6 基础窗口和窗口容器

2013-04-12 09:59 by 浪客倩心, 820 阅读, 0 推荐, 收藏,
摘要:6 基础窗口和窗口容器UI直接通过各种UI部件(UI Widget)呈现给用户信息,UI部件都基于窗口,表现为控件及其组合。一个UI需负责UI部件的生成、销毁、布局计算以及维护管理。GXUI库设计了基础窗口,其它窗口都派生于基础窗口,同时设计了窗口容器来容纳管理子窗口。6.1 窗口概述GXUI库定义了基础窗口类UIWinBase,部分代码定义如下:class UIWinBase{ friend UIContainer;……public:UIContainer* _pUIContainer; // 自身容器指针protected: // 位置信息 RECT _clientRC; ... 阅读全文

5 DirectUI消息循环机制

2013-04-09 16:51 by 浪客倩心, 1412 阅读, 0 推荐, 收藏,
摘要:5 DirectUI消息循环机制DirectUI意为直接在父窗口上绘图(paint on parent dc directly),最大特点为窗口没有句柄的概念,为逻辑上的窗口,真实的绘制过程集中到顶层句柄窗口(即有句柄的真实窗口)的绘制函数中完成。一个UI需呈现给用户各种信息,并能和用户进行交互,交互分两种:1)对外部设备事件(包括鼠标、键盘等)及时响应;2)对内部通告(如界面上数据更新等)及时反馈;一般外部设备事件和内部通告都被定义为消息,通过消息循环处理机制来完成交互过程。在WIN32对应的消息中包含句柄来标识真实窗口,而DirectUI所对应逻辑窗口没有句柄信息,因此重新定义适UI消息, 阅读全文

4 3D元素绘制

2013-04-09 16:49 by 浪客倩心, 605 阅读, 0 推荐, 收藏,
摘要:4 3D元素绘制因为GXUI库框架基于D3D天生能进行3D元素绘制,在GXUI库框架下的3D元素能与2D元素共存而互不干扰,其关系类似于3D游戏中的3D游戏画面和设置游戏参数的2D画面。但对于一个2D的UI框架而言,前3章已经做好了最基础的工作,而3D元素不是必需的,因此本章将只通过例子实现GXUI库框架下的3D元素绘制,而不做深入研究。4.1 虚拟摄像头与投影矩阵3D渲染虚构了一个虚拟摄像头,并定义了一个投影矩阵,其空间分布图如下图所示:图中顺着虚拟摄像头视角看过去,前剪裁面与后剪裁面中间虚线包括的柱体为可视柱体,只有处于可视柱体中的3D元素才可见,即能够被投影到投影平面(可理解显示器的屏幕 阅读全文

3 2D元素绘制

2013-04-09 16:45 by 浪客倩心, 972 阅读, 0 推荐, 收藏,
摘要:3 2D元素绘制在DirectX 9.0中去掉了DirectDraw(存在于DirectX 8.0中),所以只能选用D3D来完成2D绘制,其实现方法有2种:1)固定摄像头以及各UI元素的Z值,这种实现优点为可以使UI上的控件实现部分3D特效,如UI元素旋转,以及在动画过程中改变某UI元素的Z值实现远近拉升效果,缺点为计算复杂,实现较困难;2)采用DrawPrimitiveUP()函数来绘制D3DFVF_XYZRHW类型的顶点数据。对于类型标识为D3DFVF_XYZRHW的顶点数据,Direct3D不再执行世界、观察和透视变换以及光线运算,它会认为顶点已经经过了这些处理(即顶点的X、Y坐标值等于 阅读全文

2 DirectX初始化

2013-04-09 16:39 by 浪客倩心, 647 阅读, 0 推荐, 收藏,
摘要:2 DirectX初始化2.1 DirectX初始化GXUI库的绘制是基于DirextX9.0C的,支持Windows XP到Windows 8,通用性强。使用DirectX首先要进行初始化,并和创建的WIN32窗口进行绑定,步骤如下:1) 创建IDirect3D9接口对象;2) 检查硬件顶点能力,设置好DirectX绘制参数;3) 通过IDirect3D9接口对象和绘制参数创建显示设备接口(该设备接口可以被理解为显卡),同时该显示设备接口通过WIN32窗口的句柄进行绑定;4) 释放IDirect3D9接口对象;封装的DirectX初始化类为UIDXInit,示例代码位于Demo2_1中,部分 阅读全文

1 WIN32窗口外壳

2013-04-09 16:21 by 浪客倩心, 744 阅读, 0 推荐, 收藏,
摘要:1 WIN32窗口外壳1.1 WIN32窗口GXUI库的实现平台为Windows,首先我们利用vc2010自动生成一个WIN32窗口项目,并将代码做一定封装,以便以后调用。创建一个WIN32窗口包括以下几个步骤:1) 注册窗口类,包括窗口类名,图标,消息回调函数等信息;2) 用注册的窗口类名作为标示来创建一个窗口;3) 针对该进程启动消息循环,该窗口会自动调用注册的消息回调函数来处理消息;封装后的WIN32窗口类为UIWinShell,示例代码位于Demo1_1中,部分代码如下:class UIWinShell{public: void SetParam( HINSTANCE hInstanc 阅读全文