金山卫士界面源码解读及界面库分离(2)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/b2b160/article/details/6263637

前面已经发布了分离后的Kui代码,我们继续,下面来解释该代码库的使用.

 

首先要说下Kui框架的一些基础概念:

 一、

金山界面库不使用Windows的窗口布局,只是使用Windows的窗口作为一个载体,整个窗口都只是作为一个绘制面,

 

而Kui对窗口实行重新布局,取消了原窗口非客户区和客户区的概念.而自己对窗口划分为上中下三个部分.

 

上部分为Header,一般作为窗口标题栏,可以放置缩小,最大化,关闭按钮,

中部分为Body,是窗口主要功能操作区域,

下部分为Footer,一般作为状态显示.

 

这部分说明主要是为了以后写XML时使用. 

 

 二、

Kui将使用到的诸如图片,布局定义xml等文件使用zip打包,并按资源名"kuires.dat",资源类别为"SKIN",保存到运行程序的资源里

 

 三、

Kui库使用xml格式定义控件及资源的布局,这也是通常DirectUI的做法(xml布局,脚本控制[Kui里面没使用],windowless)。

 

有了以上的概念就可以使用Kui来进行界面开发了。

 

同学们可以参考第一个样例程序----该程序在客户区显示经典的hello world.并且对窗口外框进行了美化。

 

一、建立工程

首先使用向导建立一个Win32程序,对!是Win32程序,选择了Kui,你将不能使用MFC编程了,因为没有了MFC的窗口概念。

 

你将应用微软的另一个库进行程序开发----WTL。

 

好处就是开发出来的程序不会那么臃肿了,缺点嘛,就是没有MFC那么方便了。

 

不过习惯了也没什么的。都是同一家公司的技术,所以肯定各有好处。

 

二、编写入口程序

首先当然是包含库文件,在stdafx.h中定义

// 界面库
#include "../../include/KUILib.h"

 

然后写入口函数

WTL的程序都有一个程序实例,与MFC的CWinApp对应,但Kui对它进行了继承以完成了一些初始化操作,你可以直接使用该类来定义实例。如Sample1所示:

HINSTANCE g_hInstance; // 定义实例句柄,必须的。
CKuiApp<CMainWnd> _Module;//用Kui的默认类,其中CMainWnd是模版参数,是使用的主窗口类,后面会解释,定义一个实例,你也可以继承新的类。

CAppModule* _ModulePtr = &_Module;// 定义实例指针,必须的。

完整代码:

 

三、窗口函数定义

下面接着要编写主窗口类了

其中头文件MainWnd.h如下:

实现文件MainWnd.cpp如下:

 

下面对代码关键部分进行说明:

主窗口继承自两个类

CKuiDialogImpl<CMainWnd> 是对话框窗口实现模版,主窗口继承自该类,没有接触模版的同学可能对该写法有些奇怪,看看模版介绍就可以了。

CWHRoundRectFrameHelper<CMainWnd> 是一个异型窗口辅助,实现了圆角窗口。

 

上面这些宏映射了控件通知到相应的函数

 

 

上面这些宏映射了窗口消息到对应函数。

 

这些代码作用跟MFC的消息映射作用是一样的,但实作手法有些差异。其实WTL的更原始。

 

实现部分的代码就比较简单了。

 

四、最后就是资源的添加了。

可以参考Sample1.rc文件,直接在相应位置添加一行

kuires.dat    SKIN     "res//sample1.kui"

 

至此Kui库整个使用过程就是如此简单。

你需要做的就是定义主窗口的消息处理及函数而已。

 

 

本项目已经在GOOGLE的开源项目里创建了工程,如果你有兴趣加入可以联系我。

svn https://openkui.googlecode.com/svn/trunk

 

本程序代码可以在第一篇里下载

金山卫士界面源码解读及界面库分离(1)

展开阅读全文

===代码和界面分离===

11-30

做法:代码与界面分开,用户层和业务层分离。rn下面是代码,请个位大虾帮忙看下这么写是否科学,有什么不对的地方或者不科学的地方请指教,非常感谢:rnrnunit InfoClass;rnrninterfacernrnusesrn DB, ADODB;rnrn//== TYPE BEGIN ========================================rntypern TAppInfo = class(TObject)rn privatern FAdoconn: TADOConnection;rn publicrn destructor Destroy; override;rn end;rnrn 员工信息rn TUserInfo = class(TAppInfo)rn privatern function SPUser: TADOStoredProc;rn publicrn function GetUserList(AConn: TADOConnection): TADOStoredProc;rn rn function Append....rn function Update...rn function Delete...rn rn end;rnrn 部门信息rn //...rn 商品信息rn //...rnrn//== TYPE END ===========================================rnrnfunction UserInfo: TUserInfo;rnrnimplementationrnrnvarrn _UserInfo: TUserInfo;rn _SPUser: TADOStoredProc;rnrn TInfo rnrn//销毁实例,释放内存rnrndestructor TAppInfo.Destroy;rnbeginrn //这里添加需要释放的东西...rn inherited;rnend;rnrn TUserInfo rnrn//检测_UserInfo是否存在,然后赋于UserInfo;rnfunction UserInfo: TUserInfo;rnbeginrn if _UserInfo = nil then _UserInfo := TUserInfo.Create;rn Result := _UserInfo;rnend;rnrn//取员工存储过程组件rnfunction TUserInfo.SPUser: TADOStoredProc;rnbeginrn if _SPUser=nil then _SPUser := TADOStoredProc.Create(nil);rn _SPUser.Connection := FAdoconn;rn Result := _SPUser;rnend;rnrn//获得员工信息表记录rnfunction TUserInfo.GetUserList(AConn: TADOConnection): TADOStoredProc;rnbeginrn FAdoconn := AConn;rn with SPUser, SPUser.Parameters dorn beginrn close;rn clear;rn ProcedureName := 'AP_GetInfoList;1';rn Filtered := false;rn Parameters.Refresh;rn ParamByName('@Type').Value := 5;rn Open;rn end;rn Result := SPUser;rnend;rnrnrnrn//销毁对象rnrninitializationrnfinalizationrn if _UserInfo <> nil then _UserInfo.Free;rn if _SPUser<> nil then _SPUser.Free;rnrnend.rnrnrnrn使用:======================================rnrnunit Unit1;rnrninterfacernrnusesrn Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids;rnrntypern TForm1 = class(TForm)rn AdoConn: TADOConnection;rn DsInfo: TDataSource;rn DBGrid1: TDBGrid;rn Button1: TButton;rn Edit1: TEdit;rn procedure Button1Click(Sender: TObject);rn privatern Private declarations rn publicrn Public declarations rn end;rnrnvarrn Form1: TForm1;rnrnimplementationrnrnuses myclass;rnrn$R *.dfmrnrnprocedure TForm1.Button1Click(Sender: TObject);rnbeginrn DsInfo.DataSet := UserInfo.GetUserList(AdoConn);rnend;rnrn 论坛

没有更多推荐了,返回首页