前面已經(jīng)發(fā)布了分離后的Kui代碼,我們繼續(xù),下面來解釋該代碼庫的使用. 首先要說下Kui框架的一些基礎(chǔ)概念: 一、 金山界面庫不使用Windows的窗口布局,只是使用Windows的窗口作為一個(gè)載體,整個(gè)窗口都只是作為一個(gè)繪制面, 而Kui對窗口實(shí)行重新布局,取消了原窗口非客戶區(qū)和客戶區(qū)的概念.而自己對窗口劃分為上中下三個(gè)部分. 上部分為Header,一般作為窗口標(biāo)題欄,可以放置縮小,最大化,關(guān)閉按鈕, 中部分為Body,是窗口主要功能操作區(qū)域, 下部分為Footer,一般作為狀態(tài)顯示. 這部分說明主要是為了以后寫XML時(shí)使用. 二、 Kui將使用到的諸如圖片,布局定義xml等文件使用zip打包,并按資源名"kuires.dat",資源類別為"SKIN",保存到運(yùn)行程序的資源里 三、 Kui庫使用xml格式定義控件及資源的布局,這也是通常DirectUI的做法(xml布局,腳本控制[Kui里面沒使用],windowless)。 有了以上的概念就可以使用Kui來進(jìn)行界面開發(fā)了。 同學(xué)們可以參考第一個(gè)樣例程序----該程序在客戶區(qū)顯示經(jīng)典的hello world.并且對窗口外框進(jìn)行了美化。 一、建立工程 首先使用向?qū)Ы⒁粋(gè)Win32程序,對!是Win32程序,選擇了Kui,你將不能使用MFC編程了,因?yàn)闆]有了MFC的窗口概念。 你將應(yīng)用微軟的另一個(gè)庫進(jìn)行程序開發(fā)----WTL。 好處就是開發(fā)出來的程序不會那么臃腫了,缺點(diǎn)嘛,就是沒有MFC那么方便了。 不過習(xí)慣了也沒什么的。都是同一家公司的技術(shù),所以肯定各有好處。 二、編寫入口程序 首先當(dāng)然是包含庫文件,在stdafx.h中定義 // 界面庫 #include "../../include/KUILib.h" 然后寫入口函數(shù) WTL的程序都有一個(gè)程序?qū)嵗cMFC的CWinApp對應(yīng),但Kui對它進(jìn)行了繼承以完成了一些初始化操作,你可以直接使用該類來定義實(shí)例。如Sample1所示: HINSTANCE g_hInstance; // 定義實(shí)例句柄,必須的。 CKuiApp CAppModule* _ModulePtr = &_Module;// 定義實(shí)例指針,必須的。 完整代碼: 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; } 三、窗口函數(shù)定義 下面接著要編寫主窗口類了 其中頭文件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() }; 實(shí)現(xiàn)文件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(); } 下面對代碼關(guān)鍵部分進(jìn)行說明: 主窗口繼承自兩個(gè)類 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() 上面這些宏映射了控件通知到相應(yīng)的函數(shù) 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() 上面這些宏映射了窗口消息到對應(yīng)函數(shù)。 這些代碼作用跟MFC的消息映射作用是一樣的,但實(shí)作手法有些差異。其實(shí)WTL的更原始。 實(shí)現(xiàn)部分的代碼就比較簡單了。 四、最后就是資源的添加了。 可以參考Sample1.rc文件,直接在相應(yīng)位置添加一行 kuires.dat SKIN "res\\sample1.kui" 至此Kui庫整個(gè)使用過程就是如此簡單。 你需要做的就是定義主窗口的消息處理及函數(shù)而已。 |