mirror of
https://github.com/dashr9230/SA-MP.git
synced 2025-01-07 10:03:32 +08:00
303 lines
8.2 KiB
C++
303 lines
8.2 KiB
C++
//--------------------------------------------------------------------------------------
|
|
// File: DXUTgui.cpp
|
|
//
|
|
// Desc:
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//--------------------------------------------------------------------------------------
|
|
#include "dxstdafx.h"
|
|
#include "DXUTgui.h"
|
|
#include "DXUTsettingsDlg.h"
|
|
#undef min // use __min instead
|
|
#undef max // use __max instead
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
// CDXUTDialog class
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
CDXUTDialog::CDXUTDialog()
|
|
{
|
|
m_x = 0;
|
|
m_y = 0;
|
|
m_width = 0;
|
|
m_height = 0;
|
|
|
|
m_pManager = NULL;
|
|
m_bVisible = true;
|
|
m_bCaption = false;
|
|
m_bMinimized = false;
|
|
m_wszCaption[0] = L'\0';
|
|
m_nCaptionHeight = 18;
|
|
|
|
m_colorTopLeft = 0;
|
|
m_colorTopRight = 0;
|
|
m_colorBottomLeft = 0;
|
|
m_colorBottomRight = 0;
|
|
|
|
m_pCallbackEvent = NULL;
|
|
m_pCallbackEventUserContext = NULL;
|
|
|
|
m_fTimeLastRefresh = 0;
|
|
|
|
m_pControlMouseOver = NULL;
|
|
|
|
m_pNextDialog = this;
|
|
m_pPrevDialog = this;
|
|
|
|
m_nDefaultControlID = 0xffff;
|
|
m_bNonUserEvents = false;
|
|
m_bKeyboardInput = false;
|
|
m_bMouseInput = true;
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
CDXUTDialog::~CDXUTDialog()
|
|
{
|
|
int i=0;
|
|
|
|
RemoveAllControls();
|
|
|
|
m_Fonts.RemoveAll();
|
|
m_Textures.RemoveAll();
|
|
|
|
for( i=0; i < m_DefaultElements.GetSize(); i++ )
|
|
{
|
|
DXUTElementHolder* pElementHolder = m_DefaultElements.GetAt( i );
|
|
SAFE_DELETE( pElementHolder );
|
|
}
|
|
|
|
m_DefaultElements.RemoveAll();
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
void CDXUTDialog::SetCallback( PCALLBACKDXUTGUIEVENT pCallback, void* pUserContext )
|
|
{
|
|
// If this assert triggers, you need to call CDXUTDialog::Init() first. This change
|
|
// was made so that the DXUT's GUI could become seperate and optional from DXUT's core. The
|
|
// creation and interfacing with CDXUTDialogResourceManager is now the responsibility
|
|
// of the application if it wishes to use DXUT's GUI.
|
|
assert( m_pManager != NULL && "To fix call CDXUTDialog::Init() first. See comments for details." );
|
|
|
|
m_pCallbackEvent = pCallback;
|
|
m_pCallbackEventUserContext = pUserContext;
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
void CDXUTDialog::RemoveAllControls()
|
|
{
|
|
if( s_pControlFocus && s_pControlFocus->m_pDialog == this )
|
|
s_pControlFocus = NULL;
|
|
if( s_pControlPressed && s_pControlPressed->m_pDialog == this )
|
|
s_pControlPressed = NULL;
|
|
m_pControlMouseOver = NULL;
|
|
|
|
for( int i=0; i < m_Controls.GetSize(); i++ )
|
|
{
|
|
CDXUTControl* pControl = m_Controls.GetAt( i );
|
|
SAFE_DELETE( pControl );
|
|
}
|
|
|
|
m_Controls.RemoveAll();
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
CDXUTDialogResourceManager::CDXUTDialogResourceManager()
|
|
{
|
|
m_pd3dDevice = NULL;
|
|
m_pStateBlock = NULL;
|
|
m_pSprite = NULL;
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
HRESULT CDXUTDialogResourceManager::OnResetDevice()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
for( int i=0; i < m_FontCache.GetSize(); i++ )
|
|
{
|
|
DXUTFontNode* pFontNode = m_FontCache.GetAt( i );
|
|
|
|
if( pFontNode->pFont )
|
|
pFontNode->pFont->OnResetDevice();
|
|
}
|
|
|
|
if( m_pSprite )
|
|
m_pSprite->OnResetDevice();
|
|
|
|
m_pd3dDevice->CreateStateBlock( D3DSBT_ALL, &m_pStateBlock );
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
void CDXUTDialogResourceManager::OnLostDevice()
|
|
{
|
|
for( int i=0; i < m_FontCache.GetSize(); i++ )
|
|
{
|
|
DXUTFontNode* pFontNode = m_FontCache.GetAt( i );
|
|
|
|
if( pFontNode->pFont )
|
|
pFontNode->pFont->OnLostDevice();
|
|
}
|
|
|
|
if( m_pSprite )
|
|
m_pSprite->OnLostDevice();
|
|
|
|
SAFE_RELEASE( m_pStateBlock );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
void CDXUTDialogResourceManager::OnDestroyDevice()
|
|
{
|
|
int i=0;
|
|
|
|
//m_pd3dDevice = NULL;
|
|
|
|
// Release the resources but don't clear the cache, as these will need to be
|
|
// recreated if the device is recreated
|
|
for( i=0; i < m_FontCache.GetSize(); i++ )
|
|
{
|
|
DXUTFontNode* pFontNode = m_FontCache.GetAt( i );
|
|
SAFE_RELEASE( pFontNode->pFont );
|
|
}
|
|
|
|
for( i=0; i < m_TextureCache.GetSize(); i++ )
|
|
{
|
|
DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( i );
|
|
SAFE_RELEASE( pTextureNode->pTexture );
|
|
}
|
|
|
|
SAFE_RELEASE( m_pSprite );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
// CDXUTControl class
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
CDXUTControl::CDXUTControl( CDXUTDialog *pDialog )
|
|
{
|
|
m_Type = DXUT_CONTROL_BUTTON;
|
|
m_pDialog = pDialog;
|
|
m_ID = 0;
|
|
m_Index = 0;
|
|
m_pUserData = NULL;
|
|
|
|
m_bEnabled = true;
|
|
m_bVisible = true;
|
|
m_bMouseOver = false;
|
|
m_bHasFocus = false;
|
|
m_bIsDefault = false;
|
|
|
|
m_pDialog = NULL;
|
|
|
|
m_x = 0;
|
|
m_y = 0;
|
|
m_width = 0;
|
|
m_height = 0;
|
|
|
|
ZeroMemory( &m_rcBoundingBox, sizeof( m_rcBoundingBox ) );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
// CDXUTStatic class
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
HRESULT CDXUTStatic::GetTextCopy( PCHAR strDest, UINT bufferCount )
|
|
{
|
|
// Validate incoming parameters
|
|
if( strDest == NULL || bufferCount == 0 )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
// Copy the window text
|
|
StringCchCopy( strDest, bufferCount, m_strText );
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
// CDXUTIMEEditBox class
|
|
//--------------------------------------------------------------------------------------
|
|
bool CDXUTIMEEditBox::s_bEnableImeSystem; // Whether the IME system is active
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
// Enable/disable the entire IME system. When disabled, the default IME handling
|
|
// kicks in.
|
|
void CDXUTIMEEditBox::EnableImeSystem( bool bEnable )
|
|
{
|
|
s_bEnableImeSystem = bEnable;
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
void DXUTBlendColor::Init( D3DCOLOR defaultColor, D3DCOLOR disabledColor, D3DCOLOR hiddenColor )
|
|
{
|
|
for( int i=0; i < MAX_CONTROL_STATES; i++ )
|
|
{
|
|
States[ i ] = defaultColor;
|
|
}
|
|
|
|
States[ DXUT_STATE_DISABLED ] = disabledColor;
|
|
States[ DXUT_STATE_HIDDEN ] = hiddenColor;
|
|
Current = hiddenColor;
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
void DXUTBlendColor::Blend( UINT iState, float fElapsedTime, float fRate )
|
|
{
|
|
D3DXCOLOR destColor = States[ iState ];
|
|
D3DXColorLerp( &Current, &Current, &destColor, 1.0f - powf( fRate, 30 * fElapsedTime ) );
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
void CDXUTElement::SetTexture( UINT iTexture, RECT* prcTexture, D3DCOLOR defaultTextureColor )
|
|
{
|
|
this->iTexture = iTexture;
|
|
|
|
if( prcTexture )
|
|
rcTexture = *prcTexture;
|
|
else
|
|
SetRectEmpty( &rcTexture );
|
|
|
|
TextureColor.Init( defaultTextureColor );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
void CDXUTElement::SetFont( UINT iFont, D3DCOLOR defaultFontColor, DWORD dwTextFormat )
|
|
{
|
|
this->iFont = iFont;
|
|
this->dwTextFormat = dwTextFormat;
|
|
|
|
FontColor.Init( defaultFontColor );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
void CDXUTElement::Refresh()
|
|
{
|
|
TextureColor.Current = TextureColor.States[ DXUT_STATE_HIDDEN ];
|
|
FontColor.Current = FontColor.States[ DXUT_STATE_HIDDEN ];
|
|
}
|
|
|