现在的位置: 首页 > 综合 > 正文

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

2014年01月05日 ⁄ 综合 ⁄ 共 4179字 ⁄ 字号 评论关闭

前面已经发布了分离后的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;// 定义实例指针,必须的。

完整代码:

 

  1. #include "stdafx.h"  
  2. #include "./mainwnd.h"  
  3.   
  4.   
  5. //  
  6. HINSTANCE g_hInstance;   
  7. //  
  8. CKuiApp<CMainWnd> _Module;  
  9. CAppModule* _ModulePtr = &_Module;  
  10. //  
  11. //  
  12.   
  13. int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,  
  14.     LPTSTR lpCmdLine, int nCmdShow)  
  15. {  
  16.     g_hInstance = hInstance;  
  17.   
  18.   
  19.     _Module.Init( hInstance );  
  20.     _Module.Main();  
  21.     _Module.UnInit();  
  22.   
  23.       
  24.     return 0;  
  25. }  

 

三、窗口函数定义

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

其中头文件MainWnd.h如下:

 

  1. #pragma once  
  2. #include "stdafx.h"  
  3. class CMainWnd : public CKuiDialogImpl<CMainWnd>  
  4.     , public CWHRoundRectFrameHelper<CMainWnd>  
  5. {  
  6. public:  
  7.     CMainWnd(void);  
  8.     virtual ~CMainWnd(void);  
  9.     void OnDestroy();  
  10.   
  11.     void OnBkBtnClose();  
  12.     void OnBkBtnMax();  
  13.     void OnBkBtnMin();  
  14.       
  15.   
  16.     KUI_NOTIFY_MAP(IDC_RICHVIEW_WIN)  
  17.         KUI_NOTIFY_ID_COMMAND(60001, OnBkBtnClose)  
  18.         KUI_NOTIFY_ID_COMMAND(60002, OnBkBtnMax)  
  19.         KUI_NOTIFY_ID_COMMAND(60003, OnBkBtnMin)  
  20.         //KUI_NOTIFY_TAB_SELCHANGE(IDC_TAB_MAIN, OnBkTabMainSelChange)  
  21.     KUI_NOTIFY_MAP_END()  
  22.   
  23.     BEGIN_MSG_MAP_EX(CMainWnd)  
  24.         MSG_KUI_NOTIFY(IDC_RICHVIEW_WIN)  
  25.         CHAIN_MSG_MAP(CKuiDialogImpl<CMainWnd>)  
  26.         CHAIN_MSG_MAP(CWHRoundRectFrameHelper<CMainWnd>)  
  27.   
  28.         //MSG_WM_INITDIALOG(OnInitDialog)  
  29.         //MSG_WM_SYSCOMMAND(OnSysCommand)  
  30.         MSG_WM_DESTROY(OnDestroy)  
  31.           
  32.         REFLECT_NOTIFICATIONS_EX()  
  33.     END_MSG_MAP()  
  34. };  

 

实现文件MainWnd.cpp如下:

 

  1. #include "stdafx.h"  
  2. #include "./mainwnd.h"  
  3.   
  4.   
  5. CMainWnd::CMainWnd(void) : CKuiDialogImpl<CMainWnd>( "IDR_DLG_MAIN" )  
  6. {  
  7. }  
  8.   
  9. CMainWnd::~CMainWnd(void)  
  10. {  
  11. }  
  12.   
  13. void CMainWnd::OnDestroy()  
  14. {  
  15.     PostQuitMessage(0);  
  16. }  
  17.   
  18.   
  19. void CMainWnd::OnBkBtnMax()  
  20. {  
  21.     if (WS_MAXIMIZE == (GetStyle() & WS_MAXIMIZE))  
  22.     {  
  23.         SendMessage(WM_SYSCOMMAND, SC_RESTORE | HTCAPTION, 0);  
  24.     }  
  25.     else  
  26.     {  
  27.         SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE | HTCAPTION, 0);  
  28.     }  
  29. }  
  30.   
  31. void CMainWnd::OnBkBtnMin()  
  32. {  
  33.     SendMessage(WM_SYSCOMMAND, SC_MINIMIZE | HTCAPTION, 0);  
  34. }  
  35.   
  36. void CMainWnd::OnBkBtnClose()  
  37. {  
  38.     DestroyWindow();  
  39. }  

 

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

主窗口继承自两个类

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

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

 

  1. KUI_NOTIFY_MAP(IDC_RICHVIEW_WIN)  
  2.         KUI_NOTIFY_ID_COMMAND(60001, OnBkBtnClose)  
  3.         KUI_NOTIFY_ID_COMMAND(60002, OnBkBtnMax)  
  4.         KUI_NOTIFY_ID_COMMAND(60003, OnBkBtnMin)  
  5.     KUI_NOTIFY_MAP_END()  

 

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

 

  1. BEGIN_MSG_MAP_EX(CMainWnd)  
  2.   MSG_KUI_NOTIFY(IDC_RICHVIEW_WIN)  
  3.   CHAIN_MSG_MAP(CKuiDialogImpl<CMainWnd>)  
  4.   CHAIN_MSG_MAP(CWHRoundRectFrameHelper<CMainWnd>)  
  5.   
  6.   //MSG_WM_INITDIALOG(OnInitDialog)  
  7.   //MSG_WM_SYSCOMMAND(OnSysCommand)  
  8.   MSG_WM_DESTROY(OnDestroy)  
  9.     
  10.   REFLECT_NOTIFICATIONS_EX()  
  11.  END_MSG_MAP()  

 

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

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

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

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

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

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

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

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

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

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

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

抱歉!评论已关闭.