DXUTGUI控件的定制(三)
系統(tǒng)
2083 0
<!--版權(quán)所有foruok,轉(zhuǎn)載請(qǐng)注明出處!!-->
定制控件
DXUTGUI的控件庫(kù)默認(rèn)使用內(nèi)置的紋理資源,這個(gè)紋理資源可以在CDXUTDialog的Init函數(shù)中指定為我們自己的紋理資源(通常可以用一個(gè)圖片文件來(lái)替代)。在這個(gè)系列的
第一篇
中,介紹了如何使用自己的紋理資源改變整個(gè)控件庫(kù)的風(fēng)格。 研究CDXUTDialog的InitDefaultElements函數(shù)可以發(fā)現(xiàn),DXUTGUI為每種控件定義了若干元素,這些元素保存在m_DefaultElements數(shù)組中。當(dāng)增加一個(gè)新的控件時(shí),比較控件類型,將該類型的元素集從DefaultElements取出,傳遞給該控件,該控件生成自己的元素實(shí)例并保存起來(lái)。這一點(diǎn)事實(shí)支持
第二篇
中提供的修改某個(gè)控件和某類控件外觀的辦法。 我們發(fā)現(xiàn)紋理資源保存在CDXUTDialogResourceManager的成員變量m_TextureCache中。m_TextureCache是一個(gè)動(dòng)態(tài)數(shù)組,可以保存任意的紋理資源,如一個(gè)按鈕的圖片紋理,一個(gè)列表框的背景紋理等。只需要調(diào)用CDXUTDialg::SetTexture函數(shù),指定一個(gè)ID和紋理文件名即可。 紋理有了保存的地方,接下來(lái)只需要讓控件使用我們自己的紋理就可以進(jìn)行定制了。而控件的定制分為三類:?jiǎn)蝹€(gè)控件的定制、一類控件的定制、生成新控件類型。下面一一說(shuō)明怎么來(lái)實(shí)現(xiàn)。
一、單個(gè)控件定制
單個(gè)控件的定制比較簡(jiǎn)單,以按鈕為例,需要三步: (1)CDXUTDialog::AddButton生成按鈕pBtn (2)CDXUTDialog::SetTexture,生成該按鈕的紋理,記錄紋理序號(hào)nTexture (3)pBtn->GetElement獲取CDXUTElement指針pElem,pElem->SetTexture修改該控件所用紋理為nTexture。 上面的定制受限于DXUTGUI,需要根據(jù)其所實(shí)現(xiàn)的控件的渲染方法來(lái)生成自己的紋理資源,還要查看InitDefaultElements來(lái)決定怎么調(diào)用CDXUTElement::SetTexture和CDXUTElement::SetFont。
二、單類控件的定制
某一類控件的定制需要更改該類控件的默認(rèn)元素,這個(gè)可以通過(guò)CDXUTDialog::SetDefaultElement來(lái)實(shí)現(xiàn)。需要兩步完成: (1)CDXUTDialog::SetTexture,生成該類控件的紋理,記錄紋理序號(hào)nTexture (2)CDXUTDialog::GetDefaultElement或者默認(rèn)元素對(duì)象的指針pElem,然后pElem->SetTexture修改。 第(2)步也還有另一種實(shí)現(xiàn)方法。聲明CDXUTElement對(duì)象,設(shè)置其成員,然后調(diào)用CDXUTDialog::SetDefaultElement,改寫初始化時(shí)生成的默認(rèn)元素集。無(wú)論怎樣,都需要了解InitDefaultElements函數(shù)中做了什么。
三、生成新控件類型
生成新控件并使用定制的紋理,需要以下幾步: (1)實(shí)現(xiàn)控件類 (2)加載資源 (3)為新類型控件生成默認(rèn)元素集 (4)生成控件實(shí)例,添加到對(duì)話框 我們不改變DXUT自己的文件,一切都在我們自己的文件中實(shí)現(xiàn)。 (1)DXUTGUI提供的控件不一定能滿足我們需要,有時(shí)候需要自己實(shí)現(xiàn)新的控件,如圖片按鈕。我們可以從CDXUTControl派生,也可以從某個(gè)特定的控件類派生。下面我們以圖片按鈕的實(shí)現(xiàn)為例來(lái)說(shuō)明,先看代碼。
class
CDXUTImageButton:
public
CDXUTButton
...
{
public
:
CDXUTImageButton(CDXUTDialog
*
pDialog
=
NULL):CDXUTButton(pDialog)
...
{
m_Type
=
(DXUT_CONTROL_TYPE)(DXUT_CONTROL_SCROLLBAR
+
1
);
}
;
~
CDXUTImageButton(
void
)
...
{}
;
virtual
void
Render(
float
fElapsedTime)
...
{
int
nOffsetX
=
0
;
int
nOffsetY
=
0
;
DXUT_CONTROL_STATEiState
=
DXUT_STATE_NORMAL;
int
iIndex
=
0
;
if
(m_bVisible
==
false
)
...
{
iState
=
DXUT_STATE_HIDDEN;
}
else
if
(m_bEnabled
==
false
)
...
{
iState
=
DXUT_STATE_DISABLED;
iIndex
=
2
;
}
else
if
(m_bPressed)
...
{
iState
=
DXUT_STATE_PRESSED;
iIndex
=
1
;
}
else
if
(m_bMouseOver)
...
{
iState
=
DXUT_STATE_MOUSEOVER;
iIndex
=
3
;
}
else
if
(m_bHasFocus)
...
{
iState
=
DXUT_STATE_FOCUS;
iIndex
=
3
;
}
//
Mainbutton
CDXUTElement
*
pElement
=
m_Elements.GetAt(iIndex);
float
fBlendRate
=
(iState
==
DXUT_STATE_PRESSED)
?
0.0f
:
0.8f
;
//
Blendcurrentcolor
pElement
->
TextureColor.Blend(iState,fElapsedTime,fBlendRate);
m_pDialog
->
DrawSprite(pElement,
&
m_rcBoundingBox,
0.8f
);
}
;
我們需要為CDXUTImageButton指定一個(gè)控件類型,取
DXUT_CONTROL_SCROLLBAR
+
1
。同時(shí)改寫CDXUTButton的Render函數(shù),依據(jù)按鈕狀態(tài)取不同的紋理元素進(jìn)行繪制。我們所提供的圖片具有四個(gè)狀態(tài)(順序):正常態(tài)、
下壓態(tài)、禁止態(tài)、
懸停態(tài),對(duì)應(yīng)按鈕的四個(gè)狀態(tài)。 (2)有了圖片按鈕類,我們需要將按鈕的資源加載進(jìn)來(lái)。可以用CDXUTDialog::SetTexture實(shí)現(xiàn)。 (3)四次調(diào)用CDXUTDialog::SetDefaultElement,為圖片按鈕設(shè)置四個(gè)元素。 (4)分配CDXUTImageButton對(duì)象,調(diào)用CDXUTDialog::AddControl,然后設(shè)置該按鈕的ID、TEXT、位置、大小等元素。 (2)、(3)、(4)步的示例代碼:
//
initcustombutton,normalway
int
iTexture
=
g_SampleUI.SetTexture(IDC_BUTTON_CUSTOM_1,L
"
play.tga
"
);
CDXUTElementelem;
elem.iTexture
=
IDC_BUTTON_CUSTOM_1;
elem.iFont
=
0
;
RECTrc
=
...
{
0
}
;
for
(
int
i
=
0
;i
<
4
;i
++
)
...
{
SetRect(
&
rc,i
*
64
,
0
,(i
+
1
)
*
64
,
28
);
elem.SetTexture(IDC_BUTTON_CUSTOM_1,
&
rc,D3DCOLOR_ARGB(
128
,
255
,
255
,
255
));
g_SampleUI.SetDefaultElement(DXUT_CONTROL_SCROLLBAR
+
1
,i,
&
elem);
}
CDXUTImageButton
*
imgbtn
=
new
CDXUTImageButton(
&
g_SampleUI);
g_SampleUI.AddControl(imgbtn);
imgbtn
->
SetID(IDC_BUTTON_CUSTOM_1);
imgbtn
->
SetText(L
"
CustomStyle
"
);
imgbtn
->
SetSize(
64
,
27
);
imgbtn
->
SetLocation(
5
,
5
);
如果改動(dòng)DXUTGUI的源碼,則可以在枚舉類型DXUT_CONTROL_TYPE中添加DXUT_CONTROL_IMAGEBUTTON項(xiàng),同時(shí)將上面的for循環(huán)設(shè)置默認(rèn)元素集部分加入到InitDefaultElements函數(shù)中,給CDXUTDialog添加AddImageButton函數(shù)。那么生成按鈕的代碼看起來(lái)會(huì)相對(duì)簡(jiǎn)潔一些,它可能是這個(gè)樣子:
g_SampleUI.AddImageButton(IDC_BUTTON_CUSTOM_1,L
"
CustomStyle
"
,
5
, 5,
64
,
27
);
好了,DXUTGUI控件定制到此為止。
<!--版權(quán)所有foruok,轉(zhuǎn)載請(qǐng)注明出處!!-->
DXUTGUI控件的定制(三)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元