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

发布时间:2011-3-29 21:57    发布者:1770309616
关键词: 界面库分离 , 界面源码解读 , 金山卫士
金山卫士界面源码解读及界面库分离.pdf (239.76 KB)


前面已经发布了分离后的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 _Module;//用Kui的默认类,其中CMainWnd是模版参数,是使用的主窗口类,后面会解释,定义一个实例,你也可以继承新的类。
CAppModule* _ModulePtr = &_Module;// 定义实例指针,必须的。
完整代码:
view plaincopy to clipboardprint?
01.#include "stdafx.h"   
02.#include ".\mainwnd.h"   
03.  
04.  
05.//   
06.HINSTANCE g_hInstance;   
07.//   
08.CKuiApp _Module;   
09.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.}  
#include "stdafx.h"
#include ".\mainwnd.h"

//
HINSTANCE g_hInstance;
//
CKuiApp _Module;
CAppModule* _ModulePtr = &_Module;
//
//
int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
g_hInstance = hInstance;

_Module.Init( hInstance );
_Module.Main();
_Module.UnInit();

return 0;
}
三、窗口函数定义
下面接着要编写主窗口类了
其中头文件MainWnd.h如下:
view plaincopy to clipboardprint?
01.#pragma once   
02.#include "stdafx.h"   
03.class CMainWnd : public CKuiDialogImpl   
04.    , public CWHRoundRectFrameHelper   
05.{   
06.public:   
07.    CMainWnd(void);   
08.    virtual ~CMainWnd(void);   
09.    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)   
26.        CHAIN_MSG_MAP(CWHRoundRectFrameHelper)   
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.};  
#pragma once
#include "stdafx.h"
class CMainWnd : public CKuiDialogImpl
, public CWHRoundRectFrameHelper
{
public:
CMainWnd(void);
virtual ~CMainWnd(void);
void OnDestroy();
void OnBkBtnClose();
    void OnBkBtnMax();
    void OnBkBtnMin();

KUI_NOTIFY_MAP(IDC_RICHVIEW_WIN)
        KUI_NOTIFY_ID_COMMAND(60001, OnBkBtnClose)
        KUI_NOTIFY_ID_COMMAND(60002, OnBkBtnMax)
        KUI_NOTIFY_ID_COMMAND(60003, OnBkBtnMin)
        //KUI_NOTIFY_TAB_SELCHANGE(IDC_TAB_MAIN, OnBkTabMainSelChange)
    KUI_NOTIFY_MAP_END()
BEGIN_MSG_MAP_EX(CMainWnd)
  MSG_KUI_NOTIFY(IDC_RICHVIEW_WIN)
  CHAIN_MSG_MAP(CKuiDialogImpl)
  CHAIN_MSG_MAP(CWHRoundRectFrameHelper)
  //MSG_WM_INITDIALOG(OnInitDialog)
  //MSG_WM_SYSCOMMAND(OnSysCommand)
  MSG_WM_DESTROY(OnDestroy)
  
  REFLECT_NOTIFICATIONS_EX()
END_MSG_MAP()
};

实现文件MainWnd.cpp如下:
view plaincopy to clipboardprint?
01.#include "stdafx.h"   
02.#include ".\mainwnd.h"   
03.  
04.  
05.CMainWnd::CMainWnd(void) : CKuiDialogImpl( "IDR_DLG_MAIN" )   
06.{   
07.}   
08.  
09.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.}  
#include "stdafx.h"
#include ".\mainwnd.h"

CMainWnd::CMainWnd(void) : CKuiDialogImpl( "IDR_DLG_MAIN" )
{
}
CMainWnd::~CMainWnd(void)
{
}
void CMainWnd::OnDestroy()
{
    PostQuitMessage(0);
}

void CMainWnd::OnBkBtnMax()
{
if (WS_MAXIMIZE == (GetStyle() & WS_MAXIMIZE))
{
  SendMessage(WM_SYSCOMMAND, SC_RESTORE | HTCAPTION, 0);
}
else
{
  SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE | HTCAPTION, 0);
}
}
void CMainWnd::OnBkBtnMin()
{
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE | HTCAPTION, 0);
}
void CMainWnd::OnBkBtnClose()
{
DestroyWindow();
}
下面对代码关键部分进行说明:
主窗口继承自两个类
CKuiDialogImpl 是对话框窗口实现模版,主窗口继承自该类,没有接触模版的同学可能对该写法有些奇怪,看看模版介绍就可以了。
CWHRoundRectFrameHelper 是一个异型窗口辅助,实现了圆角窗口。
view plaincopy to clipboardprint?
01.KUI_NOTIFY_MAP(IDC_RICHVIEW_WIN)   
02.        KUI_NOTIFY_ID_COMMAND(60001, OnBkBtnClose)   
03.        KUI_NOTIFY_ID_COMMAND(60002, OnBkBtnMax)   
04.        KUI_NOTIFY_ID_COMMAND(60003, OnBkBtnMin)   
05.    KUI_NOTIFY_MAP_END()  
KUI_NOTIFY_MAP(IDC_RICHVIEW_WIN)
        KUI_NOTIFY_ID_COMMAND(60001, OnBkBtnClose)
        KUI_NOTIFY_ID_COMMAND(60002, OnBkBtnMax)
        KUI_NOTIFY_ID_COMMAND(60003, OnBkBtnMin)
    KUI_NOTIFY_MAP_END()

上面这些宏映射了控件通知到相应的函数
view plaincopy to clipboardprint?
01.BEGIN_MSG_MAP_EX(CMainWnd)   
02.  MSG_KUI_NOTIFY(IDC_RICHVIEW_WIN)   
03.  CHAIN_MSG_MAP(CKuiDialogImpl)   
04.  CHAIN_MSG_MAP(CWHRoundRectFrameHelper)   
05.  
06.  //MSG_WM_INITDIALOG(OnInitDialog)   
07.  //MSG_WM_SYSCOMMAND(OnSysCommand)   
08.  MSG_WM_DESTROY(OnDestroy)   
09.     
10.  REFLECT_NOTIFICATIONS_EX()   
11. END_MSG_MAP()  
BEGIN_MSG_MAP_EX(CMainWnd)
  MSG_KUI_NOTIFY(IDC_RICHVIEW_WIN)
  CHAIN_MSG_MAP(CKuiDialogImpl)
  CHAIN_MSG_MAP(CWHRoundRectFrameHelper)
  //MSG_WM_INITDIALOG(OnInitDialog)
  //MSG_WM_SYSCOMMAND(OnSysCommand)
  MSG_WM_DESTROY(OnDestroy)
  
  REFLECT_NOTIFICATIONS_EX()
END_MSG_MAP()

上面这些宏映射了窗口消息到对应函数。
这些代码作用跟MFC的消息映射作用是一样的,但实作手法有些差异。其实WTL的更原始。
实现部分的代码就比较简单了。
四、最后就是资源的添加了。
可以参考Sample1.rc文件,直接在相应位置添加一行
kuires.dat    SKIN     "res\\sample1.kui"
至此Kui库整个使用过程就是如此简单。
你需要做的就是定义主窗口的消息处理及函数而已。
本文地址:https://www.eechina.com/thread-60403-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表