小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Duilib教程-控件練習(xí)

 牛人的尾巴 2017-01-06

Duilib教程-控件練習(xí)

一、控件消息的響應(yīng)。

在HelloDuilib例子中,程序不能退出,在這里,我將添加一個(gè)關(guān)閉按鈕,當(dāng)點(diǎn)擊它時(shí),調(diào)用PostQuitMessage進(jìn)行退出。

首先在界面的右上角添加一個(gè)關(guān)閉按鈕,并取名為“btnClose”。

然后在 CHelloDuilibWnd 中重載 WindowImplBase::Notify ();

代碼如下:

復(fù)制代碼
void CHelloDuilibWnd::Notify( TNotifyUI& msg )
{
    if (msg.sType == DUI_MSGTYPE_CLICK) // 先判斷消息類型,如果是單擊
    {
        if (msg.pSender->GetName() == _T ("btnClose")) // 如果控件名為 btnClose
        {
            PostQuitMessage(0);
        }
    }
}
復(fù)制代碼

 

如是即可退出程序。

 

二、獲取XML中的控件。

一般的情況下,可以在窗口初始化的時(shí)候獲取一個(gè)控件,當(dāng)然你在什么時(shí)候獲取都是可以的,在初始化獲取,以后你就可以任意地使用了。

添加重載函數(shù):WindowImplBae::InitWindow,代碼如下:

void CHelloDuilibWnd::InitWindow()
{
    m_btnClose = static_cast <CButtonUI*> (m_PaintManager.FindControl(_T ("btnCloase")));
    ASSERT(m_btnClose != NULL);
}

把上面我們添加的關(guān)閉按鈕對(duì)象保存起來(lái)。

請(qǐng)注意,是使用 m_PaintManager 進(jìn)行獲取,該對(duì)象負(fù)責(zé)管理所有工作,包括消息的傳遞,調(diào)用控件的繪制函數(shù)等,均由它處理。

 

三、標(biāo)題欄

窗口有一個(gè)屬性 caption 指定了窗口標(biāo)題欄的位置。默認(rèn)0代表了窗口的最大值。比如說(shuō),我們想要標(biāo)題欄高度為30像素,即可設(shè)為:(0,0,0,30)left, top, right都為0,只有bottom30right0表示為最右邊。當(dāng)然如果全部設(shè)為0,會(huì)被認(rèn)為沒(méi)有標(biāo)題欄。

 

四、示例程序的練習(xí)。

在這里,我并不會(huì)為你介紹所有控件的編寫(xiě),只是作一個(gè)簡(jiǎn)單的介紹,然后控件的編寫(xiě)還需要你自己動(dòng)手,只有自己寫(xiě)過(guò)的代碼才是掌握了的代碼。如果以每天學(xué)一個(gè)控件的效率的話,大概頂多兩周即基本掌握所有控件的寫(xiě)法。下面是我以前學(xué)習(xí)的一個(gè)例子,截圖如下,最后我也會(huì)附件貼上,希望對(duì)您的學(xué)習(xí)有所幫助。

當(dāng)然我并沒(méi)有編寫(xiě)所有的控件,比如menu、progressbarsliderbar、tree等控件,這個(gè)示例是好久以前寫(xiě)的了。

 

關(guān)于控件特定的屬性,如果你用心用過(guò) DuiDesigner.exe的話,相信你已經(jīng)知道它在哪里了,DuiDesigner會(huì)將每個(gè)控件的特殊的屬性,單獨(dú)列出來(lái),如下圖中Button控件的屬性:

 

其它控件亦是如此。

 

1.控件的基本屬性:

1)Name,名稱,即類 CControlUI::GetName () 所返回的值。

2)Text, 標(biāo)題

3)TextPadding,文字偏移。比如文字從第2個(gè)像素開(kāi)始顯示,則可設(shè)為(2,0,0,0)。注意,如果是使用單選框或是復(fù)選框,一定要使用到這個(gè)屬性,使文字顯示在圖片的右邊,即TextPaddingleft為設(shè)置為圖片的寬或更寬。

4)ShowHtml,標(biāo)志Text屬性的值是否為html。注意:這里的HTML并不是真的HTML,它不能使用HTML標(biāo)簽,只能使用內(nèi)定的,如<i> 表示圖片或文字傾斜等。

5)EndEllipsis,標(biāo)志Text屬性,當(dāng)顯示不完全時(shí),最后是否以 ... 進(jìn)行顯示。

 

關(guān)于float及 Layout 的 insert、childpaddinghscrollbar、vscrollbar等屬性,我會(huì)在自動(dòng)布局中進(jìn)行說(shuō)明。

 

2.控件的特殊說(shuō)明

1)DUILIB中并沒(méi)有 TAB 控件。它的實(shí)現(xiàn)方式為:

 

使用OptionUI即單選框代表TAB選擇框,TabLayout代表窗口顯示的區(qū)域。當(dāng)Option被選擇的時(shí)候,調(diào)用CTabLayoutUI::Select (index),即可。具體如何操作,請(qǐng)參看示例。

 

2)DUILIB中并沒(méi)有單選框。

單選框和復(fù)選框都用OPTION表示,當(dāng)然現(xiàn)在也有了CCheckBoxUI類,但我并不喜歡用,原因是DuiDesigner中并沒(méi)有提供這個(gè)控件,所以我不會(huì)使用它,以免造成不必要的麻煩。

區(qū)分單選框和復(fù)選框主要是靠 Group屬性,當(dāng)指定了Group屬性時(shí),這個(gè)OPTION就是一個(gè)單選框,且所有 Group相同的Option都是同一組,即他們中只有有一個(gè)處于選中狀態(tài)。如果Group為空,那它就是一個(gè)復(fù)選框。

 

3)Label顯示的文字是單行。Text控件顯示的文本是多行。

 

4)Combox 它的子項(xiàng)設(shè)置如下圖designer并沒(méi)有提供設(shè)置項(xiàng),而且如果你的XML原來(lái)有COMBOX的子項(xiàng)設(shè)置項(xiàng),這時(shí)候你用designer打開(kāi),并進(jìn)行保存時(shí),你的子項(xiàng)會(huì)被刪除,所以要注意副本保存工作。

 

使用 ListLabelElement。

如果使用代碼動(dòng)態(tài)添加子項(xiàng),就要使用類 CListLabelElementUI或是CListLabelContainerUI,前者只是TEXT項(xiàng),當(dāng)然可以使用 ShowHtml屬性進(jìn)行圖片顯示。后者則可以添加多個(gè)控件,請(qǐng)?jiān)囼?yàn)之。

 

四、關(guān)于BUG。

1.Align屬性。

UILabel181行。代碼如下:

復(fù)制代碼
if( _tcscmp(pstrName, _T("align")) == 0 ) {
            if( _tcsstr(pstrValue, _T("left")) != NULL ) {
                m_uTextStyle &= ~(DT_CENTER | DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
                m_uTextStyle |= DT_LEFT;
            }
            if( _tcsstr(pstrValue, _T("center")) != NULL ) {
                m_uTextStyle &= ~(DT_LEFT | DT_RIGHT );
                m_uTextStyle |= DT_CENTER;
            }
            if( _tcsstr(pstrValue, _T("right")) != NULL ) {
                m_uTextStyle &= ~(DT_LEFT | DT_CENTER | DT_VCENTER | DT_SINGLELINE);
                m_uTextStyle |= DT_RIGHT;
            }
            if( _tcsstr(pstrValue, _T("top")) != NULL ) {
                m_uTextStyle &= ~(DT_BOTTOM | DT_VCENTER | DT_VCENTER);
                m_uTextStyle |= (DT_TOP | DT_SINGLELINE);
            }
            if( _tcsstr(pstrValue, _T("vcenter")) != NULL ) {
                m_uTextStyle &= ~(DT_TOP | DT_BOTTOM );            
                m_uTextStyle |= (DT_CENTER | DT_VCENTER | DT_SINGLELINE);
            }
            if( _tcsstr(pstrValue, _T("bottom")) != NULL ) {
                m_uTextStyle &= ~(DT_TOP | DT_VCENTER | DT_VCENTER);
                m_uTextStyle |= (DT_BOTTOM | DT_SINGLELINE);
            }
        }
復(fù)制代碼

 

我們可以看到,它使用_tcsstr,即字符串查找,所以如果你使用了vcenter后,左、右對(duì)齊屬性均失效的。所以,顯示圖片+文字的時(shí)候,非常蛋疼的問(wèn)題來(lái)了,文字顯示左對(duì)齊時(shí),同時(shí)也是向上對(duì)齊的,它不垂直居中。。。舊版本沒(méi)有這個(gè)問(wèn)題,這個(gè)是新版本改出來(lái)的BUG。

 

2.如果你是手動(dòng)編寫(xiě)XML,且里面包含中文,一定要將該XML使用UTF-8方式進(jìn)行保存,否則會(huì)遇到類似文字顯示不出來(lái)的BUG

 

3.使用CListUI::SortItems時(shí),如果你使用了自定義參數(shù),會(huì)導(dǎo)致崩潰,因?yàn)樗](méi)有將你的自定義參數(shù)保存,只保存了你的比較函數(shù),如果你在比較函數(shù)中使用了自定義參數(shù),很明顯會(huì)崩潰。

具體代碼在 UIList 866行,dwData該參數(shù)并未保存。

而在901行的函數(shù)ItemComareFunc中,卻使用了未初始化的m_compareData。

 

4.Tree控件,也有BUG

在 UITreeView.cpp中的31行,看代碼:

this->SetFixedHeight(18);
this->SetFixedWidth(250);

很顯然,一個(gè)TREE_ITEM寬度居然只有250像素,當(dāng)你的TREE寬度大于250的時(shí)候,就會(huì)顯示該BUG了。

 

五、當(dāng)你編寫(xiě)完所有示例之后,就會(huì)知道為什么我在上一節(jié)中說(shuō),為什么一個(gè)WND一定要有一個(gè)Layout。其具體加載的流程如下:

 

Root即為第一個(gè) Layout.

 

我的示例代碼:Duilib_test.zip

當(dāng)然,你一定要熟悉DUILIB中所有DEMO,你不用所有代碼都去看過(guò),但一定要知道他們都有些什么功能,當(dāng)你在項(xiàng)目中遇到相似的情況時(shí),可以從中去找解決方案。

比如,

360中OPTION的應(yīng)用。

GAME中DEFAULT屬性應(yīng)用,分隔條使用。

QQ有自動(dòng)換膚、加載ZIP資源代碼。

TEST_APP中關(guān)于自動(dòng)布局。。等等。

你一定要過(guò)目一遍甚至多遍。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多