📄 dxutgui.cpp
字号:
DXUTTextureNode* pTextureNode = GetTexture( pElement->iTexture );
if( pTextureNode == NULL )
return E_FAIL;
float fScaleX = (float) RectWidth( rcScreen ) / RectWidth( rcTexture );
float fScaleY = (float) RectHeight( rcScreen ) / RectHeight( rcTexture );
D3DXMATRIXA16 matTransform;
D3DXMatrixScaling( &matTransform, fScaleX, fScaleY, 1.0f );
m_pManager->m_pSprite->SetTransform( &matTransform );
D3DXVECTOR3 vPos( (float)rcScreen.left, (float)rcScreen.top, 0.0f );
vPos.x /= fScaleX;
vPos.y /= fScaleY;
return m_pManager->m_pSprite->Draw( pTextureNode->pTexture, &rcTexture, NULL, &vPos, pElement->TextureColor.Current );
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTDialog::CalcTextRect( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, int nCount )
{
HRESULT hr = S_OK;
DXUTFontNode* pFontNode = GetFont( pElement->iFont );
if( pFontNode == NULL )
return E_FAIL;
DWORD dwTextFormat = pElement->dwTextFormat | DT_CALCRECT;
// Since we are only computing the rectangle, we don't need a sprite.
hr = pFontNode->pFont->DrawText( NULL, strText, nCount, prcDest, dwTextFormat, pElement->FontColor.Current );
if( FAILED(hr) )
return hr;
return S_OK;
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTDialog::DrawText( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow, int nCount )
{
HRESULT hr = S_OK;
// No need to draw fully transparent layers
if( pElement->FontColor.Current.a == 0 )
return S_OK;
RECT rcScreen = *prcDest;
OffsetRect( &rcScreen, m_x, m_y );
// If caption is enabled, offset the Y position by its height.
if( m_bCaption )
OffsetRect( &rcScreen, 0, m_nCaptionHeight );
//debug
//DrawRect( &rcScreen, D3DCOLOR_ARGB(100, 255, 0, 0) );
D3DXMATRIXA16 matTransform;
D3DXMatrixIdentity( &matTransform );
m_pManager->m_pSprite->SetTransform( &matTransform );
DXUTFontNode* pFontNode = GetFont( pElement->iFont );
if( bShadow )
{
RECT rcShadow = rcScreen;
OffsetRect( &rcShadow, 1, 1 );
hr = pFontNode->pFont->DrawText( m_pManager->m_pSprite, strText, nCount, &rcShadow, pElement->dwTextFormat, D3DCOLOR_ARGB(DWORD(pElement->FontColor.Current.a * 255), 0, 0, 0) );
if( FAILED(hr) )
return hr;
}
hr = pFontNode->pFont->DrawText( m_pManager->m_pSprite, strText, nCount, &rcScreen, pElement->dwTextFormat, pElement->FontColor.Current );
if( FAILED(hr) )
return hr;
return S_OK;
}
//--------------------------------------------------------------------------------------
void CDXUTDialog::SetBackgroundColors( D3DCOLOR colorTopLeft, D3DCOLOR colorTopRight, D3DCOLOR colorBottomLeft, D3DCOLOR colorBottomRight )
{
m_colorTopLeft = colorTopLeft;
m_colorTopRight = colorTopRight;
m_colorBottomLeft = colorBottomLeft;
m_colorBottomRight = colorBottomRight;
}
//--------------------------------------------------------------------------------------
void CDXUTDialog::SetNextDialog( CDXUTDialog* pNextDialog )
{
if( pNextDialog == NULL )
pNextDialog = this;
m_pNextDialog = pNextDialog;
if( pNextDialog )
m_pNextDialog->m_pPrevDialog = this;
}
//--------------------------------------------------------------------------------------
void CDXUTDialog::ClearFocus()
{
if( s_pControlFocus )
{
s_pControlFocus->OnFocusOut();
s_pControlFocus = NULL;
}
ReleaseCapture();
}
//--------------------------------------------------------------------------------------
void CDXUTDialog::FocusDefaultControl()
{
// Check for default control in this dialog
for( int i=0; i < m_Controls.GetSize(); i++ )
{
CDXUTControl* pControl = m_Controls.GetAt( i );
if( pControl->m_bIsDefault )
{
// Remove focus from the current control
ClearFocus();
// Give focus to the default control
s_pControlFocus = pControl;
s_pControlFocus->OnFocusIn();
return;
}
}
}
//--------------------------------------------------------------------------------------
bool CDXUTDialog::OnCycleFocus( bool bForward )
{
CDXUTControl *pControl = NULL;
CDXUTDialog *pDialog = NULL; // pDialog and pLastDialog are used to track wrapping of
CDXUTDialog *pLastDialog; // focus from first control to last or vice versa.
if( s_pControlFocus == NULL )
{
// If s_pControlFocus is NULL, we focus the first control of first dialog in
// the case that bForward is true, and focus the last control of last dialog when
// bForward is false.
//
if( bForward )
{
// Search for the first control from the start of the dialog
// array.
for( int d = 0; d < m_pManager->m_Dialogs.GetSize(); ++d )
{
pDialog = pLastDialog = m_pManager->m_Dialogs.GetAt(d);
if( pDialog && pDialog->m_Controls.GetSize() > 0 )
{
pControl = pDialog->m_Controls.GetAt(0);
break;
}
}
if( !pDialog || !pControl )
{
// No dialog has been registered yet or no controls have been
// added to the dialogs. Cannot proceed.
return true;
}
}
else
{
// Search for the first control from the end of the dialog
// array.
for( int d = m_pManager->m_Dialogs.GetSize() - 1; d >= 0; --d )
{
pDialog = pLastDialog = m_pManager->m_Dialogs.GetAt(d);
if( pDialog && pDialog->m_Controls.GetSize() > 0 )
{
pControl = pDialog->m_Controls.GetAt( pDialog->m_Controls.GetSize() - 1 );
break;
}
}
if( !pDialog || !pControl )
{
// No dialog has been registered yet or no controls have been
// added to the dialogs. Cannot proceed.
return true;
}
}
}
else
if( s_pControlFocus->m_pDialog != this )
{
// If a control belonging to another dialog has focus, let that other
// dialog handle this event by returning false.
//
return false;
}
else
{
// Focused control belongs to this dialog. Cycle to the
// next/previous control.
pLastDialog = s_pControlFocus->m_pDialog;
pControl = (bForward) ? GetNextControl( s_pControlFocus ) : GetPrevControl( s_pControlFocus );
pDialog = pControl->m_pDialog;
}
for( int i=0; i < 0xffff; i++ )
{
// If we just wrapped from last control to first or vice versa,
// set the focused control to NULL. This state, where no control
// has focus, allows the camera to work.
int nLastDialogIndex = m_pManager->m_Dialogs.IndexOf( pLastDialog );
int nDialogIndex = m_pManager->m_Dialogs.IndexOf( pDialog );
if( ( !bForward && nLastDialogIndex < nDialogIndex ) ||
( bForward && nDialogIndex < nLastDialogIndex ) )
{
if( s_pControlFocus )
s_pControlFocus->OnFocusOut();
s_pControlFocus = NULL;
return true;
}
// If we've gone in a full circle then focus doesn't change
if( pControl == s_pControlFocus )
return true;
// If the dialog accepts keybord input and the control can have focus then
// move focus
if( pControl->m_pDialog->m_bKeyboardInput && pControl->CanHaveFocus() )
{
if( s_pControlFocus )
s_pControlFocus->OnFocusOut();
s_pControlFocus = pControl;
s_pControlFocus->OnFocusIn();
return true;
}
pLastDialog = pDialog;
pControl = (bForward) ? GetNextControl( pControl ) : GetPrevControl( pControl );
pDialog = pControl->m_pDialog;
}
// If we reached this point, the chain of dialogs didn't form a complete loop
DXTRACE_ERR( L"CDXUTDialog: Multiple dialogs are improperly chained together", E_FAIL );
return false;
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTDialogResourceManager::CreateFont( UINT iFont )
{
HRESULT hr = S_OK;
DXUTFontNode* pFontNode = m_FontCache.GetAt( iFont );
SAFE_RELEASE( pFontNode->pFont );
V_RETURN( D3DXCreateFont( m_pd3dDevice, pFontNode->nHeight, 0, pFontNode->nWeight, 1, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
pFontNode->strFace, &pFontNode->pFont ) );
return S_OK;
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTDialogResourceManager::CreateTexture( UINT iTexture )
{
HRESULT hr = S_OK;
DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( iTexture );
// Make sure there's a texture to create
if( pTextureNode->strFilename[0] == 0 )
return S_OK;
// Find the texture on the hard drive
WCHAR strPath[MAX_PATH];
hr = DXUTFindDXSDKMediaFileCch( strPath, MAX_PATH, pTextureNode->strFilename );
if( FAILED(hr) )
{
return DXTRACE_ERR( L"DXUTFindDXSDKMediaFileCch", hr );
}
// Create texture
D3DXIMAGE_INFO info;
hr = D3DXCreateTextureFromFileEx( m_pd3dDevice, strPath, D3DX_DEFAULT, D3DX_DEFAULT,
1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED,
D3DX_DEFAULT, D3DX_DEFAULT, 0,
&info, NULL, &pTextureNode->pTexture );
if( FAILED(hr) )
{
return DXTRACE_ERR( L"D3DXCreateTextureFromFileEx", hr );
}
// Store dimensions
pTextureNode->dwWidth = info.Width;
pTextureNode->dwHeight = info.Height;
return S_OK;
}
//--------------------------------------------------------------------------------------
void CDXUTDialog::InitDefaultElements()
{
SetTexture( 0, L"UI\\DXUTControls.dds" );
SetFont( 0, L"Arial", 14, FW_NORMAL );
CDXUTElement Element;
RECT rcTexture;
//-------------------------------------
// Element for the caption
//-------------------------------------
m_CapElement.SetFont( 0 );
SetRect( &rcTexture, 17, 269, 241, 287 );
m_CapElement.SetTexture( 0, &rcTexture );
m_CapElement.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB(255, 255, 255, 255);
m_CapElement.FontColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB(255, 255, 255, 255);
m_CapElement.SetFont( 0, D3DCOLOR_ARGB(255, 255, 255, 255), DT_LEFT | DT_VCENTER );
// Pre-blend as we don't need to transition the state
m_CapElement.TextureColor.Blend( DXUT_STATE_NORMAL, 10.0f );
m_CapElement.FontColor.Blend( DXUT_STATE_NORMAL, 10.0f );
//-------------------------------------
// CDXUTStatic
//-------------------------------------
Element.SetFont( 0 );
Element.FontColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 200, 200, 200, 200 );
// Assign the Element
SetDefaultElement( DXUT_CONTROL_STATIC, 0, &Element );
//-------------------------------------
// CDXUTButton - Button
//-------------------------------------
SetRect( &rcTexture, 0, 0, 136, 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_BUTTON, 0, &Element );
//-------------------------------------
// CDXUTButton - Fill layer
//-------------------------------------
SetRect( &rcTexture, 136, 0, 272, 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_BUTTON, 1, &Element );
//-------------------------------------
// CDXUTCheckBox - Box
//-------------------------------------
SetRect( &rcTexture, 0, 54, 27, 81 );
Element.SetTexture( 0, &rcTexture );
Element.SetFont( 0, D3DCOLOR_ARGB(255, 255, 255, 255), DT_LEFT | DT_VCENTER );
Element.FontColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 200, 200, 200, 200 );
Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB(150, 255, 255, 255);
Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB(200, 255, 255, 255);
Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB(255, 255, 255, 255);
// Assign the Element
SetDefaultElement( DXUT_CONTROL_CHECKBOX, 0, &Element );
//-------------------------------------
// CDXUTCheckBox - Check
//-------------------------------------
SetRect( &rcTexture, 27, 54, 54, 81 );
Element.SetTexture( 0, &rcTexture );
// Assign the Element
SetDefaultElement( DXUT_CONTROL_CHECKBOX, 1, &Element );
//-------------------------------------
// CDXUTRadioButton - Box
//-------------------------------------
SetRect( &rcTexture, 54, 54, 81, 81 );
Element.SetTexture( 0, &rcTexture );
Element.SetFont( 0, D3DCOLOR_ARGB(255, 255, 255, 255), DT_LEFT | DT_VCENTER );
Element.FontColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 200, 200, 200, 200 );
Element.TextureColor.States[ DXUT_STATE_NORMAL ]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -