金山衛士介面原始碼解讀及介面庫分離 2

2021-05-24 15:08:15 字數 3098 閱讀 6329

前面已經發布了分離後的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"

然後寫入口函式

完整**:

view plain

copy to clipboard

print?

#include "stdafx.h"

#include "./mainwnd.h"

//hinstance g_hinstance;   

////

//int winapi _twinmain( hinstance hinstance, hinstance hprevinstance,  

lptstr lpcmdline, int ncmdshow)  

三、視窗函式定義

下面接著要編寫主視窗類了

其中標頭檔案mainwnd.h如下:

view plain

copy to clipboard

print?

#pragma once

#include "stdafx.h"

class cmainwnd : public ckuidialogimpl

, public cwhroundrectframehelper

;  實現檔案mainwnd.cpp如下:

view plain

copy to clipboard

print?

#include "stdafx.h"

#include "./mainwnd.h"

cmainwnd::cmainwnd(void) : ckuidialogimpl( "idr_dlg_main" )  

cmainwnd::~cmainwnd(void)  

void cmainwnd::ondestroy()  

void cmainwnd::onbkbtnmax()  

else

}  void cmainwnd::onbkbtnmin()  

void cmainwnd::onbkbtnclose()  

下面對**關鍵部分進行說明:

主視窗繼承自兩個類

ckuidialogimpl是對話方塊視窗實現模版,主視窗繼承自該類,沒有接觸模版的同學可能對該寫法有些奇怪,看看模版介紹就可以了。

cwhroundrectframehelper是乙個異型視窗輔助,實現了圓角視窗。

view plain

copy to clipboard

print?

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 plain

copy to clipboard

print?

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庫整個使用過程就是如此簡單。

你需要做的就是定義主視窗的訊息處理及函式而已。

金山衛士介面 tinyxml

tinyxml就不用介紹了。金山衛士中使用tinyxml作為xml解析。tinyxml有乙個缺點,就是不能支援unicode,這個問題也是眾所周知的。但程式已經採用unicode編碼了,還想用金山衛士的介面,暫時的權宜之計如下 1,tinyxml不影響從文字中讀取的文字內容 2,tinyxml不影響...

JDK原始碼解讀 Collection(介面)

collection介面是對儲存資料的容器的抽象,裡面定義的方法其實就是容器應該具有的功能。boolean add e e boolean addall collection c boolean remove object o boolean removeall collection c void ...

JDK原始碼解讀 Iterator(介面)

1.hasnext 判斷是否還有元素 boolean hasnext 2.next 返回下乙個元素 e next 3.remove default void remove 一般集合都提供了remove方法,為什麼迭代器介面還要提供乙個介面呢?其實如果在iterator迭代操作的時候,collecti...