duilib入門問題集

2022-08-13 06:30:15 字數 4614 閱讀 9848

問:如何把資源放入zip?

答: 先setresourcepath設定資源目錄,再setresourcezip設定壓縮資源檔名

問:如何設定窗體的初始化大小?

答:設定xml檔案的window標籤的size屬性。

問:如何設定滑鼠可拖動窗體的範圍大小?

答:設定xml檔案的window標籤的caption屬性。

問:如何設定窗體可以通過拖動邊緣改變大小?

答:在窗體建立函式的第三個引數設定為ui_wndstyle_frame才可響應拖動改變大小,和雙擊標題事件。

問:為何滑鼠移動到邊緣沒有改變窗體大小的箭頭出現,不能通過拖動改變窗體大小?

答:設定window標籤的sizebox屬性,例如sizebox="2,2,2,2"

問:窗體不可雙擊最大化如何實現?

答:在窗體建立函式的第三個引數設定為ui_wndstyle_dialog。

問:應用程式exe圖示如何設定?

答:使用窗體成員函式seticon,引數為資源icon的id。

問:初始化時,最大化窗體如何實現?

答:呼叫窗體的sendmessage給窗體傳送最大化訊息sc_maximize,sendmessage(wm_syscommand, sc_maximize,0);

問:動態改變窗體的大小如何實現?

答:使用窗體函式resizeclient,引數分別重設的寬和高。

問:如何設定窗體螢幕居中顯示?

答:使用窗體的centerwindow函式。

問:窗體透明度如何設定?

答:設定window標籤屬性bktrans="true" alpha="200" alpha的值為0-255。這種設定是全體窗體透明度,所有控制項都將變透明。

如果想單純設定背景透明度控制項不透明度,可以製作半透明的背景,設定window標籤的bktrans="true",並且不設定alpha屬性,切記!此時背景透明,其它控制項不透明。

單獨設定某個控制項的透明度,可以使用的fade屬性,或者mask屬性。fade表示設定透明度,取值0-255。mask為設定透明的顏色。

問:預設設定的為拉伸平鋪模式,如何設定不拉伸顯示?

答:設定的source和dest屬性,soure="左,上,右,下" dest="左,上,右,下" 

表示將source區域的顯示到按鈕的dest區域上。這裡的右和下是指座標,不是指寬度和高度。右=左+width.下=top+height。

問:如何設定選定編輯框文字的背景顏色?

答:設定nativebkcolor屬性。

問:如何設定按鈕的滑鼠懸浮時的字型顏色?

答:設定按鈕的hottextcolor屬性,相對的還有pushedtextcolor和focustextcolor.

問:如何設定按鈕按下時字型的顏色?

答:設定按鈕的pushedtextcolor屬性,相對的還有hottextcolor和focustextcolor.

問:如何自定義xml控制項?

答:自定義控制項和複雜的控制項型別都是由簡單基本控制項組成。

在寫好乙個自定義的控制項xml模板後,

cdialogbuilder dlg_builder;

ccontrolui * pcontrol = dlg_builder.create("item.xml");

注意這裡的item.xml要放在主介面的xml所在的資料夾內,並且無需在指定路徑了。

該函式返回乙個ccontrolui的乙個控制代碼,得到這樣乙個控制代碼就是乙個控制項了。

如果要獲取複雜控制項的某個子控制項的控制代碼,然後想通過該控制代碼改變子控制項的狀態。

首先給這個子控制項取乙個名字,然後可以通過pcontrol的findsubcontrol("name")來獲取該

控制項的控制代碼了。得到控制代碼後就可以設定它的所有屬性了,例如

pbtn->setattribute(_t("normalimage"), _t("file='images\\downlist_ok.png' dest='20,14,32,26'"));就能更改它的狀態了。

問:多執行緒下如何更改dui的介面資訊?

答:1、在stdafx.h加入以下

#define vc_extralean

#include // mfc 核心元件和標準元件

#include // mfc 擴充套件

#include // mfc 自動化類

#ifndef _afx_no_ole_support

#include // mfc 對 internet explorer 4 公共控制項的支援

#endif

#ifndef _afx_no_afxcmn_support

#include // mfc 對 windows 公共控制項的支援

#endif // _afx_no_afxcmn_support

2、在程式初始化main的開始加入mfc的初始化。

// initialize mfc and print and error on failure

if (!afxwininit(::getmodulehandle(null), null, ::getcommandline(), 0))

3、設定頁屬性-->常規-->使用mfc設定為 use mfc in a shared dll

4、設定c++-->**生成-->執行時庫根據debug或者release設定為mdd或者md。

duilib繪圖部分

影象的繪製大部分使用了繪製引擎的drawimagestring函式,該函式實現知道影象名稱繪製到指定目標區域的功能

並且通過指定pstrmodify的屬性能夠進行不同需求的繪製,例如,僅扣取源影象的某個位置繪製到目標的某個區域、

設定四邊圓角繪製、為bmp等指定某種顏色為透明顏色、平鋪或者拉伸繪製、設定透明度等。

drawimagestring最終又呼叫crenderengine::drawimage進行繪製。

duilib中所有元素的顯示都在整個訊息迴圈的wm_paint中進行繪製。

第一次繪製之前會傳送乙個名為_t("windowinit")的通知。

然後為ccontrolui的繪製,繪製的順序為:背景顏色->背景圖->狀態圖->文字->邊框

會順序呼叫ccontrolui的以下函式。 

paintbkcolor(hdc);            // 繪製背景顏色  

paintbkimage(hdc);          // 繪製背景圖  

paintstatusimage(hdc);   // 繪製狀態圖  

painttext(hdc);                 // 繪製文字  

paintborder(hdc);            // 繪製邊框

duilib中把檔案載入到記憶體後,由庫stb_image.c解析並最終轉為dib處理。

duilib支援從檔案、從包含檔案的壓縮包檔案和vc資源中載入。

載入後最終返回timageinfo結構體指標,包含hbitmap、影象寬度、影象高度、alpha通道、mask和資源型別等資訊。

載入函式為:timageinfo* crenderengine::loadimage(stringorid bitmap, lpctstr type, dword mask);

duilib中所有的資源只從載入一次,然後儲存在cpaintmanagerui中的m_mimagehash成員中,該成員為乙個

hashmap儲存timageinfo*資訊,當已經存在要繪製顯示的資訊時,直接從map中獲取顯示,否則從檔案載入

在新增到map中。

問:如何管理duilib介面**資源?

答:把所有xml檔案在同乙個目錄下,資源另外放在乙個地方。當如下進行布局資源時,skin目錄為設定資源的目錄,imagedir1目錄放置1.xml檔案利用到的資源,imagedir2放置2.xml檔案利用到的資源。

然後1.xml檔案檔案中的資源名稱需要加上相對於當前xml檔案的路徑資訊即可。例如:normalimage="imagedir1/1.png"這樣的形式。使用設計器為xml新增資源時會自動轉化為相對路徑。

skin/

1.xml

2.xml

imagedir1/

1.png

2.png

imagedir2/

1.png

2.png

需注意乙個問題,那就是字型的管理。字型對於乙個視窗來說是全域性的,索引從0開始,font = 0表示使用排在第一位的字型。如果乙個介面被拆分為多個xml檔案管理,並且當每個單獨的檔案自己新增字型時,聯合起來的時候,會跟其它的字型發生衝突,即索引不是原來的索引了。索引得從全域性來看。按照全域性的方式進行設定好索引後,對於每個xml檔案的預覽操作時,又看不到所見即所得的效果了。

duilib入門教程

duilib是乙個開源 的directui 介面庫,使用xml來描述介面風格,介面布局,將介面與邏輯分離,能夠快速開發美觀的介面。2.2編譯 開啟根目錄的duilib.sln,github上的工程是vs2013的,使用vs2017開啟時,會提示公升級工程,點公升級即可。如果沒有公升級成功,在工程配置...

DuiLib入門簡明教程

2013 duilib入門教程彙總 2013 duilib入門簡明教程 前言 1 2013 duilib入門簡明教程 vs環境配置 2 2013 duilib入門簡明教程 第乙個程式 hello world 3 2013 duilib入門簡明教程 響應按鈕事件 4 2013 duilib入門簡明教程...

duilib與CEF衝突問題

duilib與cef衝突問題 flyfish 關於嵌入式瀏覽器框架cef cef dom.h檔案中的定義是 cef virtual cefrefptrgetnextsibling 0 關於duilib引用了標頭檔案windowsx.h中的定義是 define getnextsibling hwnd ...