DXUT 控件图片

原创 2012年03月21日 14:59:59

DXUT 示例中是用DXUTRes.cpp 中的 g_DXUTGUITextureSrcData存储控件图片内存数据, 然后导入程序使用.

该g_DXUTGUITextureSrcData中的数据是从dxutcontrols.dds转换过来的. dxutcontrols.dds可以到directx 安装目录里搜到.


使用自己的控件图片 


其中添加了圆和箭头按钮

第一步

在DXUTgui.h中 CDXUTDialogResourceManager类中添加函数声明

int AddControlsTexture( LPCWSTR strFilename );


 

第二步

在DXUTgui.cpp中添加函数实现

int CDXUTDialogResourceManager::AddControlsTexture( LPCWSTR strFilename )
{
    DXUTTextureNode* pNewTextureNode = new DXUTTextureNode;
    if( pNewTextureNode == NULL )
        return -1;

    ZeroMemory( pNewTextureNode, sizeof( DXUTTextureNode ) );
    pNewTextureNode->bFileSource = true;
    wcscpy_s( pNewTextureNode->strFilename, MAX_PATH, strFilename );
    
    m_TextureCache.GetAt(0) = pNewTextureNode;

    if( m_pd3d9Device )
        CreateTexture9( 0 );

    return 0;
}

第三步

添加自己的控件函数(以箭头按钮举例)

在DXUTgui.h中CDXUTDialog类的声明中添加

HRESULT             AddArrowButton( int ID, LPCWSTR strText, int x, int y, int width, int height, UINT nHotkey=0 /*热键*/ ,//按钮
         bool bIsDefault=false/* 默认焦点*/, CDXUTArrowButton** ppCreated=NULL );

 

在DXUTgui.cpp中添加实现

HRESULT CDXUTDialog::AddArrowButton( int ID, LPCWSTR strText, int x, int y, int width, int height, UINT nHotkey,
          bool bIsDefault, CDXUTArrowButton** ppCreated )
{
 HRESULT hr = S_OK;

 CDXUTArrowButton* pButton = new CDXUTArrowButton( this );

 if( ppCreated != NULL )
  *ppCreated = pButton;

 if( pButton == NULL )
  return E_OUTOFMEMORY;

 hr = AddControl( pButton );
 if( FAILED( hr ) )
  return hr;

 // Set the ID and list index
 pButton->SetID( ID );
 pButton->SetText( strText );
 pButton->SetLocation( x, y );
 pButton->SetSize( width, height );
 pButton->SetHotkey( nHotkey );
 pButton->m_bIsDefault = bIsDefault;

 return S_OK;
}

 

在DXUTgui.h中添加

class CDXUTArrowButton : public CDXUTStatic
{
public:
 CDXUTArrowButton( CDXUTDialog* pDialog = NULL );

 virtual bool    HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
 virtual bool    HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
 virtual void    OnHotkey()
 {
  if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this );
  m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this );
 }

 virtual BOOL    ContainsPoint( POINT pt )
 {
  return PtInRect( &m_rcBoundingBox, pt );
 }
 virtual bool    CanHaveFocus()
 {
  return ( m_bVisible && m_bEnabled );
 }

 virtual void    Render( float fElapsedTime );

protected:
 bool m_bPressed;
};

 

在DXUTgui.cpp中添加实现

CDXUTArrowButton::CDXUTArrowButton( CDXUTDialog* pDialog )
{
 m_Type = DXUT_CONTROL_ARROWBUTTON;
 m_pDialog = pDialog;

 m_bPressed = false;
 m_nHotkey = 0;
}

 

bool CDXUTArrowButton::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam )
{
 if( !m_bEnabled || !m_bVisible )
  return false;

 switch( uMsg )
 {
 case WM_KEYDOWN:
  {
   switch( wParam )
   {
   case VK_SPACE:
    m_bPressed = true;
    return true;
   }
  }

 case WM_KEYUP:
  {
   switch( wParam )
   {
   case VK_SPACE:
    if( m_bPressed == true )
    {
     m_bPressed = false;
     m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this );
    }
    return true;
   }
  }
 }
 return false;
}

bool CDXUTArrowButton::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam )
{
 if( !m_bEnabled || !m_bVisible )
  return false;

 switch( uMsg )
 {
 case WM_LBUTTONDOWN:
 case WM_LBUTTONDBLCLK:
  {
   if( ContainsPoint( pt ) )
   {
    // Pressed while inside the control
    m_bPressed = true;
    SetCapture( DXUTGetHWND() );

    if( !m_bHasFocus )
     m_pDialog->RequestFocus( this );

    return true;
   }

   break;
  }

 case WM_LBUTTONUP:
  {
   if( m_bPressed )
   {
    m_bPressed = false;
    ReleaseCapture();

    if( !m_pDialog->m_bKeyboardInput )
     m_pDialog->ClearFocus();

    // Button click
    if( ContainsPoint( pt ) )
     m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this );

    return true;
   }

   break;
  }
 };

 return false;
}

void CDXUTArrowButton::Render( float fElapsedTime )
{
 int nOffsetX = 0;
 int nOffsetY = 0;

 DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL;

 if( m_bVisible == false )
 {
  iState = DXUT_STATE_HIDDEN;
 }
 else if( m_bEnabled == false )
 {
  iState = DXUT_STATE_DISABLED;
 }
 else if( m_bPressed )
 {
  iState = DXUT_STATE_PRESSED;

  nOffsetX = 1;
  nOffsetY = 2;
 }
 else if( m_bMouseOver )
 {
  iState = DXUT_STATE_MOUSEOVER;

  nOffsetX = -1;
  nOffsetY = -2;
 }
 else if( m_bHasFocus )
 {
  iState = DXUT_STATE_FOCUS;
 }

 // Background fill layer
 //TODO: remove magic numbers
 CDXUTElement* pElement = m_Elements.GetAt( 0 );

 float fBlendRate = ( iState == DXUT_STATE_PRESSED ) ? 0.0f : 0.8f;

 RECT rcWindow = m_rcBoundingBox;
 OffsetRect( &rcWindow, nOffsetX, nOffsetY );


 // Blend current color
 pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
 pElement->FontColor.Blend( iState, fElapsedTime, fBlendRate );

 m_pDialog->DrawSprite( pElement, &rcWindow, DXUT_FAR_BUTTON_DEPTH );
 m_pDialog->DrawText( m_strText, pElement, &rcWindow );

 // Main button
 pElement = m_Elements.GetAt( 1 );

 // Blend current color
 pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
 pElement->FontColor.Blend( iState, fElapsedTime, fBlendRate );

 m_pDialog->DrawSprite( pElement, &rcWindow, DXUT_NEAR_BUTTON_DEPTH );
 m_pDialog->DrawText( m_strText, pElement, &rcWindow );


}

 

在CDXUTDialog::InitDefaultElements()中添加

//箭头
 SetRect( &rcTexture, 270, 20, 380, 54 );
 Element.SetTexture( 0, &rcTexture );
 Element.SetFont( 0 );
 Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 255, 255, 255 );
 Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 200, 255, 255, 255 );
 Element.FontColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB( 255, 0, 0, 0 );

 // Assign the Element
 SetDefaultElement( DXUT_CONTROL_ARROWBUTTON, 0, &Element );


 //-------------------------------------
 // - Fill layer划过时的图片
 //-------------------------------------
 SetRect( &rcTexture, 380, 20, 490, 54 );
 Element.SetTexture( 0, &rcTexture, D3DCOLOR_ARGB( 0, 255, 255, 255 ) );
 Element.TextureColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB( 160, 255, 255, 255 );
 Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 60, 0, 0, 0 );
 Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 30, 255, 255, 255 );

 // Assign the Element
 SetDefaultElement( DXUT_CONTROL_ARROWBUTTON, 1, &Element );//DXUT_CONTROL_ARROWBUTTON在DXUTgui.h的enum DXUT_CONTROL_TYPE中添加

 

使用自己控件图片

在SimpleSample.cpp中的void InitApp()中添加代码如下

    g_SettingsDlg.Init( &g_DialogResourceManager );//原有代码
    g_HUD.Init( &g_DialogResourceManager );//原有代码
    g_SampleUI.Init( &g_DialogResourceManager );//原有代码


    g_DialogResourceManager.AddControlsTexture(L"tomb.dds");//控件图片

    g_HUD.AddArrowButton( IDC_TEMPGRAPH, L"曲 线 图",730, 70, 100, 50, 0,true);




版权声明:本文为博主原创文章,未经博主允许不得转载。

一天搞定DXUT三步曲之一:DXUT框架

当初学GL的时候, 一直想写那个HDR的SHADER程序,苦于没有框架,再加上GL的例子太少,最后果断踏上了DX这条不归路.花了一天时间(准备的说是第一天的上午和第二天的下午)把DXUT的框架学习了,...
  • seamanj
  • seamanj
  • 2013年07月10日 00:32
  • 3523

DXUT编程指南(一):DXUT概览

DXUT编程指南(译自DirectX SDK Document)                  DXUT是一个建立在Direct3D API之上的层,它在大多数的Direct3D指南和实例中被使用...
  • ntwilford
  • ntwilford
  • 2006年08月02日 10:36
  • 7009

DXUT 初步学习 框架初识

初步了解dxut框架,练习一个例子程序。
  • shiyongfu19890308
  • shiyongfu19890308
  • 2014年08月19日 15:58
  • 1284

Directx9.0 学习教程2 - 使用DXUT框架

DXUT框架是 samples例子的一个公共框架。非常方便的把很多本来需要复杂、而且重复的操作,都封装了起来。 使用步骤非常简单 C:\Program Files\Microsoft Direct...
  • cq361106306
  • cq361106306
  • 2014年09月27日 20:37
  • 3025

DXUT框架剖析(5)

本文版权归博客园 lovedday 所有,转载请详细标明原创作者及原文出处,以示尊重!原创作者: lovedday 原文出处:DXUT框架剖析(5) 修改可用的设备应用程序可以通过DXUTSetCal...
  • kenkao
  • kenkao
  • 2011年06月30日 10:37
  • 1024

DXUT.H / DXUT.CPP 解析

DXUTState类        成员变量 存储设备和窗口信息        成员函数 获取和设置成员变量   创建实例函数 (创建实例) 不对用户开放DXUT.CPP        ...
  • w18767104183
  • w18767104183
  • 2012年03月07日 22:34
  • 1297

一天搞定DXUT三步曲之一:DXUT框架

当初学GL的时候, 一直想写那个HDR的SHADER程序,苦于没有框架,再加上GL的例子太少,最后果断踏上了DX这条不归路.花了一天时间(准备的说是第一天的上午和第二天的下午)把DXUT的框架学习了,...
  • seamanj
  • seamanj
  • 2013年07月10日 00:32
  • 3523

如何使用DXUT框架

转载请注明出处! 作者:zdd 出处:http://www.cnblogs.com/graphics/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章...
  • davied9
  • davied9
  • 2014年04月07日 15:51
  • 770

一天搞定DXUT三步曲之二:添加文本

添加文本比较简单,自己看源码吧,我就不多说了     //-----------------------------------------------------------------------...
  • seamanj
  • seamanj
  • 2013年07月10日 00:39
  • 1295

DXUT 初步学习 框架初识

初步了解dxut框架,练习一个例子程序。
  • shiyongfu19890308
  • shiyongfu19890308
  • 2014年08月19日 15:58
  • 1284
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DXUT 控件图片
举报原因:
原因补充:

(最多只允许输入30个字)