📄 dxutgui.cpp
字号:
//--------------------------------------------------------------------------------------
// File: DXUTgui.cpp
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
#include "DXUT.h"
#include "DXUTgui.h"
#include "DXUTsettingsDlg.h"
#include "DXUTres.h"
#undef min // use __min instead
#undef max // use __max instead
#ifndef WM_XBUTTONDOWN
#define WM_XBUTTONDOWN 0x020B // (not always defined)
#endif
#ifndef WM_XBUTTONUP
#define WM_XBUTTONUP 0x020C // (not always defined)
#endif
#ifndef WM_MOUSEWHEEL
#define WM_MOUSEWHEEL 0x020A // (not always defined)
#endif
#ifndef WHEEL_DELTA
#define WHEEL_DELTA 120 // (not always defined)
#endif
// Minimum scroll bar thumb size
#define SCROLLBAR_MINTHUMBSIZE 8
// Delay and repeat period when clicking on the scroll bar arrows
#define SCROLLBAR_ARROWCLICK_DELAY 0.33
#define SCROLLBAR_ARROWCLICK_REPEAT 0.05
#define DXUT_NEAR_BUTTON_DEPTH 0.6f
#define DXUT_FAR_BUTTON_DEPTH 0.8f
#define DXUT_MAX_GUI_SPRITES 500
D3DCOLORVALUE D3DCOLOR_TO_D3DCOLORVALUE( D3DCOLOR c )
{
D3DCOLORVALUE cv = { ( ( c >> 16 ) & 0xFF ) / 255.0f,
( ( c >> 8 ) & 0xFF ) / 255.0f,
( c & 0xFF ) / 255.0f,
( ( c >> 24 ) & 0xFF ) / 255.0f };
return cv;
}
#define UNISCRIBE_DLLNAME L"usp10.dll"
#define GETPROCADDRESS( Module, APIName, Temp ) \
Temp = GetProcAddress( Module, #APIName ); \
if( Temp ) \
*(FARPROC*)&_##APIName = Temp
#define PLACEHOLDERPROC( APIName ) \
_##APIName = Dummy_##APIName
#define IMM32_DLLNAME L"imm32.dll"
#define VER_DLLNAME L"version.dll"
CHAR g_strUIEffectFile[] = \
"Texture2D g_Texture;"\
""\
"SamplerState Sampler"\
"{"\
" Filter = MIN_MAG_MIP_LINEAR;"\
" AddressU = Wrap;"\
" AddressV = Wrap;"\
"};"\
""\
"BlendState UIBlend"\
"{"\
" AlphaToCoverageEnable = FALSE;"\
" BlendEnable[0] = TRUE;"\
" SrcBlend = SRC_ALPHA;"\
" DestBlend = INV_SRC_ALPHA;"\
" BlendOp = ADD;"\
" SrcBlendAlpha = ONE;"\
" DestBlendAlpha = ZERO;"\
" BlendOpAlpha = ADD;"\
" RenderTargetWriteMask[0] = 0x0F;"\
"};"\
""\
"BlendState NoBlending"\
"{"\
" BlendEnable[0] = FALSE;"\
" RenderTargetWriteMask[0] = 0x0F;"\
"};"\
""\
"DepthStencilState DisableDepth"\
"{"\
" DepthEnable = false;"\
"};"\
"DepthStencilState EnableDepth"\
"{"\
" DepthEnable = true;"\
"};"\
"struct VS_OUTPUT"\
"{"\
" float4 Pos : SV_POSITION;"\
" float4 Dif : COLOR;"\
" float2 Tex : TEXCOORD;"\
"};"\
""\
"VS_OUTPUT VS( float3 vPos : POSITION,"\
" float4 Dif : COLOR,"\
" float2 vTexCoord0 : TEXCOORD )"\
"{"\
" VS_OUTPUT Output;"\
""\
" Output.Pos = float4( vPos, 1.0f );"\
" Output.Dif = Dif;"\
" Output.Tex = vTexCoord0;"\
""\
" return Output;"\
"}"\
""\
"float4 PS( VS_OUTPUT In ) : SV_Target"\
"{"\
" return g_Texture.Sample( Sampler, In.Tex ) * In.Dif;"\
"}"\
""\
"float4 PSUntex( VS_OUTPUT In ) : SV_Target"\
"{"\
" return In.Dif;"\
"}"\
""\
"technique10 RenderUI"\
"{"\
" pass P0"\
" {"\
" SetVertexShader( CompileShader( vs_4_0, VS() ) );"\
" SetGeometryShader( NULL );"\
" SetPixelShader( CompileShader( ps_4_0, PS() ) );"\
" SetDepthStencilState( DisableDepth, 0 );"\
" SetBlendState( UIBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );"\
" }"\
"}"\
"technique10 RenderUIUntex"\
"{"\
" pass P0"\
" {"\
" SetVertexShader( CompileShader( vs_4_0, VS() ) );"\
" SetGeometryShader( NULL );"\
" SetPixelShader( CompileShader( ps_4_0, PSUntex() ) );"\
" SetDepthStencilState( DisableDepth, 0 );"\
" SetBlendState( UIBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );"\
" }"\
"}"\
"technique10 RestoreState"\
"{"\
" pass P0"\
" {"\
" SetDepthStencilState( EnableDepth, 0 );"\
" SetBlendState( NoBlending, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );"\
" }"\
"}";
const UINT g_uUIEffectFileSize = sizeof(g_strUIEffectFile);
// DXUT_MAX_EDITBOXLENGTH is the maximum string length allowed in edit boxes,
// including the NULL terminator.
//
// Uniscribe does not support strings having bigger-than-16-bits length.
// This means that the string must be less than 65536 characters long,
// including the NULL terminator.
#define DXUT_MAX_EDITBOXLENGTH 0xFFFF
double CDXUTDialog::s_fTimeRefresh = 0.0f;
CDXUTControl* CDXUTDialog::s_pControlFocus = NULL; // The control which has focus
CDXUTControl* CDXUTDialog::s_pControlPressed = NULL; // The control currently pressed
struct DXUT_SCREEN_VERTEX
{
float x, y, z, h;
D3DCOLOR color;
float tu, tv;
static DWORD FVF;
};
DWORD DXUT_SCREEN_VERTEX::FVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1;
struct DXUT_SCREEN_VERTEX_UNTEX
{
float x, y, z, h;
D3DCOLOR color;
static DWORD FVF;
};
DWORD DXUT_SCREEN_VERTEX_UNTEX::FVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE;
struct DXUT_SCREEN_VERTEX_10
{
float x, y, z;
D3DCOLORVALUE color;
float tu, tv;
};
inline int RectWidth( RECT &rc ) { return ( (rc).right - (rc).left ); }
inline int RectHeight( RECT &rc ) { return ( (rc).bottom - (rc).top ); }
//--------------------------------------------------------------------------------------
// 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_bDrag = 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::Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog )
{
m_pManager = pManager;
if( bRegisterDialog )
pManager->RegisterDialog( this );
SetTexture( 0, MAKEINTRESOURCE(0xFFFF), (HMODULE)0xFFFF );
InitDefaultElements();
}
//--------------------------------------------------------------------------------------
void CDXUTDialog::Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, LPCWSTR pszControlTextureFilename )
{
m_pManager = pManager;
if( bRegisterDialog )
pManager->RegisterDialog( this );
SetTexture( 0, pszControlTextureFilename );
InitDefaultElements();
}
//--------------------------------------------------------------------------------------
void CDXUTDialog::Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, LPCWSTR szControlTextureResourceName, HMODULE hControlTextureResourceModule )
{
m_pManager = pManager;
if( bRegisterDialog )
pManager->RegisterDialog( this );
SetTexture( 0, szControlTextureResourceName, hControlTextureResourceModule );
InitDefaultElements();
}
//--------------------------------------------------------------------------------------
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 && L"To fix call CDXUTDialog::Init() first. See comments for details." );
m_pCallbackEvent = pCallback;
m_pCallbackEventUserContext = pUserContext;
}
//--------------------------------------------------------------------------------------
void CDXUTDialog::RemoveControl( int ID )
{
for( int i=0; i < m_Controls.GetSize(); i++ )
{
CDXUTControl* pControl = m_Controls.GetAt( i );
if( pControl->GetID() == ID )
{
// Clean focus first
ClearFocus();
// Clear references to this control
if( s_pControlFocus == pControl )
s_pControlFocus = NULL;
if( s_pControlPressed == pControl )
s_pControlPressed = NULL;
if( m_pControlMouseOver == pControl )
m_pControlMouseOver = NULL;
SAFE_DELETE( pControl );
m_Controls.Remove( i );
return;
}
}
}
//--------------------------------------------------------------------------------------
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()
{
// Begin D3D9-specific
m_pd3d9Device = NULL;
m_pStateBlock = NULL;
m_pSprite = NULL;
// End D3D9-specific
// Begin D3D10-specific
m_pd3d10Device = NULL;
m_pEffect10 = NULL;
m_pTechRenderUI10 = NULL;
m_pTechRenderUIUntex10 = NULL;
m_pFxTexture10 = NULL;
m_pInputLayout10 = NULL;
m_pVBScreenQuad10 = NULL;
m_pStateBlock10 = NULL;
m_pSprite10 = NULL;
m_nBackBufferWidth = m_nBackBufferHeight = 0;
// End D3D10-specific
}
//--------------------------------------------------------------------------------------
CDXUTDialogResourceManager::~CDXUTDialogResourceManager()
{
int i;
for( i=0; i < m_FontCache.GetSize(); i++ )
{
DXUTFontNode* pFontNode = m_FontCache.GetAt( i );
SAFE_DELETE( pFontNode );
}
m_FontCache.RemoveAll();
for( i=0; i < m_TextureCache.GetSize(); i++ )
{
DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( i );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -