金山卫士界面源码解读及界面库分离(2)
发布时间:2011-3-29 21:57
发布者:1770309616
![]() 前面已经发布了分离后的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 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 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 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 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 { } 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库整个使用过程就是如此简单。 你需要做的就是定义主窗口的消息处理及函数而已。 |
网友评论