ZT DXUTGUI控制項的定製

2021-06-09 19:02:09 字數 4512 閱讀 5383

from:  

dxutgui提供的預設控制項已經實現了透明效果和類似色彩鍵的效果。在d3d中沒有直接的色彩鍵(directdraw中有)功能,不過可以利用alpha通道實現類似的效果,只是需要具有alpha通道。

dxutgui的控制項紋理正是這樣實現的,用photoshop開啟儲存下來的紋理,可以看到其alpha通道的。

要在d3d9中實現透明和顏色過濾功能,需要兩個步驟。

(1)定義fvf結構體,包含頂點顏色域。定義fvf標記,使其包含d3dfvf_diffuse。

struct customvertext;

#define customfvf   d3dfvf_xyzrhw | d3dfvf_diffuse

(2)設定渲染狀態:

pd3ddevice->setrenderstate( d3drs_alphablendenable,true );

pd3ddevice->setrenderstate( d3drs_srcblend, d3dblend_srcalpha );

pd3ddevice->setrenderstate( d3drs_destblend, d3dblend_invsrcalpha );   

pd3ddevice->settexturestagestate( 0, d3dtss_alphaop, d3dtop_modulate );

pd3ddevice->settexturestagestate( 0, d3dtss_alphaarg1, d3dta_texture );

pd3ddevice->settexturestagestate( 0, d3dtss_alphaarg2, d3dta_diffuse );

透明效果的實現是通過頂點顏色的alpha值(0完全透明,255不透明)實現的,而顏色過濾是通過紋理的alpha通道實現的,兩者的乘積可以實現「透明+過濾」效果。這樣就可以實現不規則且透明的控制項。

對應在dxutgui中,如果要設定某乙個控制項的透明度,可以呼叫該控制項的getelement函式,獲取cdxutelement型別的指標,呼叫其settexture函式實現。

要統一設定某一類控制項的透明度,可以呼叫cdxutdialog::getdefaultelement獲取該類控制項的分子物件的指標,修改其texturecolor成員的alpha通道(或者呼叫settexture函式)。

知道了dxutgui如何實現上述效果,我們就有了定製ui的基礎。通過提供具有alpha通道的給dxutgui使用,就可以隨心所欲的實現各種效果的控制項了。但如何讓dxutgui為某乙個控制項(如乙個按鈕)使用我們自己的,還需要做進一步的挖掘和實現。

dxutgui的控制項庫預設使用內建的紋理資源,這個紋理資源可以在cdxutdialog的init函式中指定為我們自己的紋理資源(通常可以用乙個檔案來替代)。

研究cdxutdialog的initdefaultelements函式可以發現,dxutgui為每種控制項定義了若干元素,這些元素儲存在m_defaultelements陣列中。當增加乙個新的控制項時,比較控制項型別,將該型別的元素集從defaultelements取出,傳遞給該控制項,該控制項生成自己的元素例項並儲存起來。

我們發現紋理資源儲存在cdxutdialogresourcemanager的成員變數m_texturecache中。m_texturecache是乙個動態陣列,可以儲存任意的紋理資源,如乙個按鈕的紋理,乙個列表框的背景紋理等。只需要呼叫cdxutdialg::settexture函式,指定乙個id和紋理檔名即可。

紋理有了儲存的地方,接下來只需要讓控制項使用我們自己的紋理就可以進行定製了。而控制項的定製分為三類:單個控制項的定製、一類控制項的定製、生成新控制項型別。下面一一說明怎麼來實現。

單個控制項的定製比較簡單,以按鈕為例,需要三步:

(1)cdxutdialog::addbutton生成按鈕pbtn

(2)cdxutdialog::settexture,生成該按鈕的紋理,記錄紋理序號ntexture

(3)pbtn->getelement獲取cdxutelement指標pelem,pelem->settexture修改該控制項所用紋理為ntexture。

上面的定製受限於dxutgui,需要根據其所實現的控制項的渲染方法來生成自己的紋理資源,還要檢視initdefaultelements來決定怎麼呼叫cdxutelement::settexture和cdxutelement::setfont。

某一類控制項的定製需要更改該類控制項的預設元素,這個可以通過cdxutdialog::setdefaultelement來實現。需要兩步完成:

(1)cdxutdialog::settexture,生成該類控制項的紋理,記錄紋理序號ntexture

(2)cdxutdialog::getdefaultelement或者預設元素物件的指標pelem,然後pelem->settexture修改。

第(2)步也還有另一種實現方法。宣告cdxutelement物件,設定其成員,然後呼叫cdxutdialog::setdefaultelement,改寫初始化時生成的預設元素集。無論怎樣,都需要了解initdefaultelements函式中做了什麼。

生成新控制項並使用定製的紋理,需要以下幾步:

(1)實現控制項類

(2)載入資源

(3)為新型別控制項生成預設元素集

(4)生成控制項例項,新增到對話方塊

我們不改變dxut自己的檔案,一切都在我們自己的檔案中實現。

(1)dxutgui提供的控制項不一定能滿足我們需要,有時候需要自己實現新的控制項,如按鈕。我們可以從cdxutcontrol派生,也可以從某個特定的控制項類派生。下面我們以按鈕的實現為例來說明,先看**。

class cdxutimagebutton : public cdxutbutton

;

~cdxutimagebutton(void)...{};
virtual void render( float felapsedtime )

else if( m_benabled == false )

else if( m_bpressed )

else if( m_bmouseover )

else if( m_bhasfocus )

// main button

cdxutelement *pelement = m_elements.getat( iindex );

float fblendrate = ( istate == dxut_state_pressed ) ? 0.0f : 0.8f;

// blend current color

pelement->texturecolor.blend( istate, felapsedtime, fblendrate );

m_pdialog->drawsprite( pelement, &m_rcboundingbox, 0.8f );

};

我們需要為cdxutimagebutton指定乙個控制項型別,取dxut_control_scrollbar + 1。同時改寫cdxutbutton的render函式,依據按鈕狀態取不同的紋理元素進行繪製。我們所提供的具有四個狀態(順序):正常態、下壓態、禁止態、懸停態,對應按鈕的四個狀態。

(2)有了按鈕類,我們需要將按鈕的資源載入進來。可以用cdxutdialog::settexture實現。

(3)四次呼叫cdxutdialog::setdefaultelement,為按鈕設定四個元素。

(4)分配cdxutimagebutton物件,呼叫cdxutdialog::addcontrol,然後設定該按鈕的id、text、位置、大小等元素。

(2)、(3)、(4)步的示例**:

//init custom button, normal way

int itexture = g_sampleui.settexture(idc_button_custom_1, l"play.tga");

cdxutelement elem;

elem.itexture = idc_button_custom_1;

elem.ifont = 0;

rect rc = ;

for(int i=0; i<4; i++)

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);

如果改動dxutgui的原始碼,則可以在列舉型別dxut_control_type中新增dxut_control_imagebutton項,同時將上面的for迴圈設定預設元素集部分加入到initdefaultelements函式中,給cdxutdialog新增addimagebutton函式。那麼生成按鈕的**看起來會相對簡潔一些,它可能是這個樣子:

好了,dxutgui控制項定製到此為止。

Qt定製控制項列表

目錄本帖為持續更新帖,主要展示日常開發中各式各樣的控制項 複雜窗體。本帖中只包含了部分展示效果,更多展示效果後續陸續放出 本帖持續更新。支援元件定製 有償提供原始碼 原有進度條基礎上新增功效,顏色支援配置 支援多種顯示模式,和消失動畫 窗體當大時,字型支援平滑放大 支援凍結列 凍結行 自動行高 合併...

Windows 定製控制項訊息處理函式

一 概述 控制項的訊息處理函式是由系統定義好了的,通常情況下,不需要自己提供。但當需要對控制項進行特殊控制時,可以提供乙個訊息處理函式,替換原來的訊息處理函式。自己的處理完成後,再呼叫控制項的預設訊息處理。二 相關函式 1.視窗類的屬性可以通過getwindowlong和setwindowlong進...

如何定製日曆控制項顯示的星期文字

關鍵 以紅色字型標出 public class test system.web.ui.page region web 窗體設計器生成的 override protected void oninit eventargs e 設計器支援所需的方法 不要使用 編輯器修改 此方法的內容。private vo...