duilib入門問題集


問:如何把資源放入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的界面信息?
答:線程里不要操作界面的信息,應該通過SendMessage或者PostMessage給界面的m_hWnd發送自定義消息。然后在界面的消息循環里面在做操作界面的動作。
自定義處理的消息處理函數可以從重寫方法
LRESULT MyWnd::HandleCustomMessage( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
{
//這里處理完后,bHandled置true 返回基類,讓基類去操作
return WindowImplBase::HandleCustomMessage(uMsg, wParam, lParam, bHandled);
}
具體可以如下使用:
#define ON_PERCENT_MSG              WM_USER + 500
然后在線程函數中發送消息給界面
int DownloadView::on_percent( double percent, int index, INT_PTR user_data )
{
    ::SendMessage(m_hWnd, ON_PERCENT_MSG, (WPARAM)&percent, (LPARAM)user_data);
    return 0;
}


最后在界面消息循環中進行處理消息
LRESULT DownloadView::HandleCustomMessage( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
{
    switch (uMsg)
    {
    case ON_PERCENT_MSG:
         // 處理界面相關的操作
        break;
    default:
        break;
    }
    return WindowImplBase::HandleCustomMessage(uMsg, wParam, lParam, bHandled);
}





問:如何讓使用duilib的win32工程支持MFC?
答:
1、在stdafx.h加入以下
#define VC_EXTRALEAN
#include <afxwin.h>         // MFC 核心組件和標准組件
#include <afxext.h>         // MFC 擴展
#include <afxdisp.h>        // MFC 自動化類
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // MFC 對 Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // 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))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
return 1;
}
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的以下函數。 

  1. PaintBkColor(hDC);            // 繪制背景顏色  
  2. PaintBkImage(hDC);          // 繪制背景圖  
  3. PaintStatusImage(hDC);   // 繪制狀態圖  
  4. PaintText(hDC);                 // 繪制文本  
  5. PaintBorder(hDC);            // 繪制邊框

所以有需求在界面上動態繪制一些內容時,可以通過CControlUI進行子類化,然后重寫PaintStatusImage,
在PaintStatusImage里面進行繪圖操作。繪制時可以直接調用duilib繪制引擎進行繪制,比較便捷。當然也可以使用GDI+等庫直接進行繪制。


duilib的圖像文件的加載是通過一個開源庫stb_image.c實現。
並只使用了該庫的stbi_load_from_memory和stbi_image_free這兩個功能函數。
該庫的鏈接地址:http://nothings.org/stb_image.c
該庫對圖片的格式的支持情況說明如下:
JPEG 支持Baseline標准型的JPEG,不支持漸進式Progressive的JPEG
PNG   僅支持8位的png圖像
BMP  不支持1bpp的bmp,不支持行程編碼RLE的bmp
PSD  緊顯示合成的圖像,不支持額外的通道
GIF *comp always reports as 4-channel


所以在duilib中使用的圖片時需要注意到這個限制,否則有些圖片將顯示不出來。


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文件的預覽操作時,又看不到所見即所得的效果了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM