定制控件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_DefaultElement" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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ì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久99精品视频 | 欧美在线一二三区 | 欧美四虎| 欧美日韩在线免费观看 | 日韩成人av在线 | 国产福利专区精品视频 | 嫩草网站 | 欧美日韩一本 | 久久久久久国产精品免费免费狐狸 | 香港一级毛片在线播放 | 日韩精品在线播放 | 日韩欧美在线视频 | 精品视频一区二区三区 | 日本黄色免费网址 | 欧美激情综合亚洲五月蜜桃 | 欧美一级片毛片 | 91精品久久| 日本高清在线观看视频 | 欧美日韩一区二区三 | 久久精品成人 | 久草在线视频资源站 | 久久婷五月综合 | 亚洲精品在线视频观看 | 爱爱视频网站 | 中文字幕免费在线观看视频 | 日韩精品久久 | 开心激情综合网 | 99精品免费视频 | 色综合久久天天综合观看 | 欧美一级高潮片免费的 | 热久久伊人 | 成人毛片一区 | 日韩色区| 午夜男人女人爽爽爽视频 | 久久久大片| 999在线 | 天天做天天干 | 欧美一区不卡 | 精品一区二区三区在线观看国产 | 国产精品网址在线观看你懂的 | 一区国产精品 |