天天看點

duilib入門之貼圖描述、類html文本描述、動态換膚、Dll插件、資源打包

轉載自duilib入門文檔

貼圖描述:

         Duilib的表現力豐富很大程度上得益于貼圖描述的簡單強大。Duilib的貼圖描述分為簡單模式和複雜模式兩種。

         簡單模式使用檔案名做為貼圖描述内容,在這種方式下,此圖檔将會以拉伸方式鋪滿控件。

         複雜模式使用帶屬性的字元串表示貼圖方式,既支援從檔案中加載圖檔,也可以從資源中加載,具體如下:

         如果是從檔案加載,設定file屬性,如file='XXX.png',不要寫res和restype屬性

         如果從資源加載,設定res和restype屬性,不要設定file屬性

         dest屬性的作用是指定圖檔繪制在控件的一部分上面(繪制目标位置)

         source屬性的作用是指定使用圖檔的一部分

         corner屬性是指圖檔安裝scale9方式繪制

         mask屬性是給不支援alpha通道的圖檔格式(如bmp)指定透明色

         fade屬性是設定圖檔繪制的透明度

         hole屬性是指定scale9繪制時要不要繪制中間部分

         xtiled屬性設定成true就是指定圖檔在x軸不要拉伸而是平鋪,ytiled屬性設定成true就是指定圖檔在y軸不要拉伸而是平鋪:

         Duilib使用一種經過簡化的類html格式文本來描述複雜的圖文格式。使用<>或{}符号來辨別文法标簽,支援标簽嵌套,如<l><b>text</b></l>,但是應該避免交叉嵌套,如<l><b>text</l></b>。

          <b>text</b> 表示text的内容使用粗體

          <c #xxxxxx>text</c> 表示text内容使用#xxxxxx顔色,#xxxxxx表示16進制的RGB值

         <f x>text</f>

表示text内容使用x序号的字型

         <i>text</i> 表示text内容使用斜體

          <i x y z>

表示此次插入圖檔,x表示圖檔名稱,y表示此圖檔包含幾張字圖檔(可不填,預設值1),z表示目前使用的字圖檔id(可不填,預設值0)

         <a x>text</a> 表示text内容有連結功能,x表示連結位址(可不填),用法如app:notepad or http:www.xxx.com,此字元串需要在使用者程式中解析處理。

         <n> 表示此次換行

          <p x>text</p> 表示text内容是一個段落(從這裡開始換行),x表示此段落文字水準距離(可不填)

         <r>text</r>

表示text内容不使用文法标簽功能

         <s>text</s> 表示text内容被選中(顯示選中的背景顔色)

          <u>text</u> 表示text内容使用下劃線

         <x i> 表示從此處向後面移動x個像素值

         <y i> 表示該行高度固定為y個像素值

         使用标簽功能需要把控件的showhtml屬性設定為true。

         Duilib是一個以貼圖為主要表現手段的界面庫,實作換膚非常簡單,可以通過給控件設定不同的圖檔來實作換膚,比如給需要換膚的控件調用CControlUI::SetBkImage。但是針對換膚功能,Duilib提供了更為簡單的方法,即使用CPaintManagerUI::ReloadSkin。

假設我們給程式建立了兩套皮膚,分别打包成skin1.zip和skin2.zip,在程式運作的時候,執行:

         CPaintManagerUI::SetResourceZip(_T("skin2.zip")); // 或者skin1.zip

         CPaintManagerUI::ReloadSkin();

         這樣簡單的兩行代碼,就實作了全部視窗從skin1皮膚到skin2皮膚的切換。你也可以随時再次調用上面兩行代碼,把皮膚切換回去。

         Duilib支援使用外部dll來擴充控件:

         在dll中,隻需要實作一個接口CreateControl,如

extern"C" __declspec(dllexport) CControlUI* CreateControl(LPCTSTR pstrType)

{

    if( _tcscmp(pstrType,_T("ButtonEx")) == 0 ) return new CButtonExUI;

    return NULL;

}

          在使用程式中,需要在WinMain函數把插件dll使用CPaintManagerUI::LoadPlugin加載進來,然後就可以和内置控件一樣使用了。

int APIENTRYWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/,int nCmdShow)

    CManager::SetInstance(hInstance);

   CManager::SetResourcePath(CManager::GetInstancePath());

CManager::LoadPlugin(PLUGINNAME);

// ……

         Duilib使用資源打包功能非常簡單,在程式開發完成後隻需做兩個步驟即可:

         進入資源目錄,然後使用具備zip壓縮功能的軟體(如winrar、winzip、7zip等)把布局xml和圖檔等資源壓縮到一個zip檔案包裡。

         在WinMain函數中CPaintManagerUI::SetInstance(hInstance)的後面加入CPaintManagerUI::SetResourceZip(_T("xxx.zip")),如

CManager::SetResourcePath(CManager::GetInstancePath());

CPaintManagerUI::SetResourceZip(_T("xxx.zip"));

         這樣就完成了資源打包功能,釋出程式隻需要把exe、dll和zip檔案帶上就行了。有時為了需要,也可以修改.zip為其他擴充名,比如.dat。