📄 dxutsettingsdlg.cpp
字号:
//--------------------------------------------------------------------------------------
// File: DXUTSettingsDlg.cpp
//
// Dialog for selection of device settings
//
// 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
//--------------------------------------------------------------------------------------
// Internal functions forward declarations
//--------------------------------------------------------------------------------------
WCHAR* DXUTPresentIntervalToString( UINT pi );
WCHAR* DXUTMultisampleTypeToString(D3DMULTISAMPLE_TYPE MultiSampleType);
WCHAR* DXUTD3DDeviceTypeToString(D3DDEVTYPE devType);
WCHAR* DXUTVertexProcessingTypeToString(DWORD vpt);
//--------------------------------------------------------------------------------------
// Global state
//--------------------------------------------------------------------------------------
DXUTDeviceSettings g_DeviceSettings;
CD3DSettingsDlg* DXUTGetSettingsDialog()
{
// Using an accessor function gives control of the construction order
static CD3DSettingsDlg dlg;
return &dlg;
}
//--------------------------------------------------------------------------------------
CD3DSettingsDlg::CD3DSettingsDlg()
{
m_pStateBlock = NULL;
m_bActive = false;
}
//--------------------------------------------------------------------------------------
CD3DSettingsDlg::~CD3DSettingsDlg()
{
OnDestroyDevice();
}
//--------------------------------------------------------------------------------------
void CD3DSettingsDlg::Init( CDXUTDialogResourceManager* pManager )
{
assert( pManager );
m_Dialog.Init( pManager, false ); // Don't register this dialog.
CreateControls();
}
//--------------------------------------------------------------------------------------
void CD3DSettingsDlg::Init( CDXUTDialogResourceManager* pManager, LPCWSTR szControlTextureFileName )
{
assert( pManager );
m_Dialog.Init( pManager, false, szControlTextureFileName ); // Don't register this dialog.
CreateControls();
}
//--------------------------------------------------------------------------------------
void CD3DSettingsDlg::Init( CDXUTDialogResourceManager* pManager, LPCWSTR pszControlTextureResourcename, HMODULE hModule )
{
assert( pManager );
m_Dialog.Init( pManager, false, pszControlTextureResourcename, hModule ); // Don't register this dialog.
CreateControls();
}
//--------------------------------------------------------------------------------------
void CD3DSettingsDlg::CreateControls()
{
m_Dialog.EnableKeyboardInput( true );
m_Dialog.SetFont( 0, L"Arial", 15, FW_NORMAL );
m_Dialog.SetFont( 1, L"Arial", 28, FW_BOLD );
// Right-justify static controls
CDXUTElement* pElement = m_Dialog.GetDefaultElement( DXUT_CONTROL_STATIC, 0 );
if( pElement )
{
pElement->dwTextFormat = DT_VCENTER | DT_RIGHT;
// Title
CDXUTStatic* pStatic = NULL;
m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Direct3D Settings", 10, 5, 400, 50, false, &pStatic );
pElement = pStatic->GetElement( 0 );
pElement->iFont = 1;
pElement->dwTextFormat = DT_TOP | DT_LEFT;
}
// DXUTSETTINGSDLG_ADAPTER
m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Display Adapter", 10, 50, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_ADAPTER, 200, 50, 300, 23 );
// DXUTSETTINGSDLG_DEVICE_TYPE
m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Render Device", 10, 75, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_DEVICE_TYPE, 200, 75, 300, 23 );
// DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_FULLSCREEN
m_Dialog.AddRadioButton( DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_WINDOWED_GROUP, L"Windowed", 240, 105, 300, 16 );
m_Dialog.AddCheckBox( DXUTSETTINGSDLG_DEVICECLIP, L"Clip to device when window spans across multiple monitors", 250, 126, 400, 16 );
m_Dialog.AddRadioButton( DXUTSETTINGSDLG_FULLSCREEN, DXUTSETTINGSDLG_WINDOWED_GROUP, L"Full Screen", 240, 147, 300, 16 );
// DXUTSETTINGSDLG_ADAPTER_FORMAT
m_Dialog.AddStatic( DXUTSETTINGSDLG_ADAPTER_FORMAT_LABEL, L"Adapter Format", 10, 180, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_ADAPTER_FORMAT, 200, 180, 300, 23 );
// DXUTSETTINGSDLG_RESOLUTION
m_Dialog.AddStatic( DXUTSETTINGSDLG_RESOLUTION_LABEL, L"Resolution", 10, 205, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_RESOLUTION, 200, 205, 200, 23 );
m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION )->SetDropHeight( 106 );
// DXUTSETTINGSDLG_RES_SHOW_ALL
m_Dialog.AddCheckBox( DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL, L"Show All Aspect Ratios", 420, 205, 200, 23, false );
// DXUTSETTINGSDLG_REFRESH_RATE
m_Dialog.AddStatic( DXUTSETTINGSDLG_REFRESH_RATE_LABEL, L"Refresh Rate", 10, 230, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_REFRESH_RATE, 200, 230, 300, 23 );
// DXUTSETTINGSDLG_BACK_BUFFER_FORMAT
m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Back Buffer Format", 10, 265, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT, 200, 265, 300, 23 );
// DXUTSETTINGSDLG_DEPTH_STENCIL
m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Depth/Stencil Format", 10, 290, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL, 200, 290, 300, 23 );
// DXUTSETTINGSDLG_MULTISAMPLE_TYPE
m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Multisample Type", 10, 315, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE, 200, 315, 300, 23 );
// DXUTSETTINGSDLG_MULTISAMPLE_QUALITY
m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Multisample Quality", 10, 340, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY, 200, 340, 300, 23 );
// DXUTSETTINGSDLG_VERTEX_PROCESSING
m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Vertex Processing", 10, 365, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_VERTEX_PROCESSING, 200, 365, 300, 23 );
// DXUTSETTINGSDLG_PRESENT_INTERVAL
m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Vertical Sync", 10, 390, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_PRESENT_INTERVAL, 200, 390, 300, 23 );
// DXUTSETTINGSDLG_OK, DXUTSETTINGSDLG_CANCEL
m_Dialog.AddButton( DXUTSETTINGSDLG_OK, L"OK", 230, 435, 73, 31 );
m_Dialog.AddButton( DXUTSETTINGSDLG_CANCEL, L"Cancel", 315, 435, 73, 31, 0, true );
}
//--------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnCreateDevice( IDirect3DDevice9* pd3dDevice )
{
if( pd3dDevice == NULL )
return DXUT_ERR_MSGBOX( L"CD3DSettingsDlg::OnCreatedDevice", E_INVALIDARG );
// Create the fonts/textures
m_Dialog.SetCallback( StaticOnEvent, (void*) this );
return S_OK;
}
//--------------------------------------------------------------------------------------
// Changes the UI defaults to the current device settings
//--------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::Refresh()
{
HRESULT hr = S_OK;
CD3DEnumeration* pD3DEnum = DXUTGetEnumeration();
g_DeviceSettings = DXUTGetDeviceSettings();
// Fill the UI with the current settings
AddDeviceType( g_DeviceSettings.DeviceType );
SetWindowed( FALSE != g_DeviceSettings.pp.Windowed );
SetDeviceClip( 0 != (g_DeviceSettings.pp.Flags & D3DPRESENTFLAG_DEVICECLIP) );
AddAdapterFormat( g_DeviceSettings.AdapterFormat );
AddResolution( g_DeviceSettings.pp.BackBufferWidth, g_DeviceSettings.pp.BackBufferHeight );
AddRefreshRate( g_DeviceSettings.pp.FullScreen_RefreshRateInHz );
AddBackBufferFormat( g_DeviceSettings.pp.BackBufferFormat );
AddDepthStencilBufferFormat( g_DeviceSettings.pp.AutoDepthStencilFormat );
AddMultisampleType( g_DeviceSettings.pp.MultiSampleType );
AddMultisampleQuality( g_DeviceSettings.pp.MultiSampleQuality );
if( g_DeviceSettings.BehaviorFlags & D3DCREATE_PUREDEVICE )
AddVertexProcessingType( D3DCREATE_PUREDEVICE );
else if( g_DeviceSettings.BehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING )
AddVertexProcessingType( D3DCREATE_HARDWARE_VERTEXPROCESSING );
else if( g_DeviceSettings.BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING )
AddVertexProcessingType( D3DCREATE_SOFTWARE_VERTEXPROCESSING );
else if( g_DeviceSettings.BehaviorFlags & D3DCREATE_MIXED_VERTEXPROCESSING )
AddVertexProcessingType( D3DCREATE_MIXED_VERTEXPROCESSING );
CD3DEnumDeviceSettingsCombo* pBestDeviceSettingsCombo = pD3DEnum->GetDeviceSettingsCombo( g_DeviceSettings.AdapterOrdinal, g_DeviceSettings.DeviceType, g_DeviceSettings.AdapterFormat, g_DeviceSettings.pp.BackBufferFormat, (g_DeviceSettings.pp.Windowed != 0) );
if( NULL == pBestDeviceSettingsCombo )
return DXUT_ERR_MSGBOX( L"GetDeviceSettingsCombo", E_INVALIDARG );
// Get the adapters list from CD3DEnumeration object
CGrowableArray<CD3DEnumAdapterInfo*>* pAdapterInfoList = pD3DEnum->GetAdapterInfoList();
if( pAdapterInfoList->GetSize() == 0 )
return DXUT_ERR_MSGBOX( L"CD3DSettingsDlg::OnCreatedDevice", DXUTERR_NOCOMPATIBLEDEVICES );
CDXUTComboBox* pAdapterCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER );
pAdapterCombo->RemoveAllItems();
// Add adapters
for( int iAdapter=0; iAdapter<pAdapterInfoList->GetSize(); iAdapter++ )
{
CD3DEnumAdapterInfo* pAdapterInfo = pAdapterInfoList->GetAt(iAdapter);
AddAdapter( pAdapterInfo->szUniqueDescription, pAdapterInfo->AdapterOrdinal );
}
pAdapterCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.AdapterOrdinal ) );
hr = OnAdapterChanged();
if( FAILED(hr) )
return hr;
//m_Dialog.Refresh();
CDXUTDialog::SetRefreshTime( (float) DXUTGetTime() );
return S_OK;
}
//--------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnResetDevice()
{
const D3DSURFACE_DESC* pDesc = DXUTGetBackBufferSurfaceDesc();
m_Dialog.SetLocation( 0, 0 );
m_Dialog.SetSize( pDesc->Width, pDesc->Height );
m_Dialog.SetBackgroundColors( D3DCOLOR_ARGB(255, 98, 138, 206),
D3DCOLOR_ARGB(255, 54, 105, 192),
D3DCOLOR_ARGB(255, 54, 105, 192),
D3DCOLOR_ARGB(255, 10, 73, 179) );
IDirect3DDevice9* pd3dDevice = DXUTGetD3DDevice();
pd3dDevice->BeginStateBlock();
pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
pd3dDevice->EndStateBlock( &m_pStateBlock );
return S_OK;
}
//--------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnRender( float fElapsedTime )
{
IDirect3DDevice9* pd3dDevice = DXUTGetD3DDevice();
// Clear the render target and the zbuffer
pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, 0x00003F3F, 1.0f, 0);
// Render the scene
if( SUCCEEDED( pd3dDevice->BeginScene() ) )
{
m_pStateBlock->Capture();
pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
m_Dialog.OnRender( fElapsedTime );
m_pStateBlock->Apply();
pd3dDevice->EndScene();
}
return S_OK;
}
//--------------------------------------------------------------------------------------
LRESULT CD3DSettingsDlg::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
m_Dialog.MsgProc( hWnd, uMsg, wParam, lParam );
if( uMsg == WM_KEYDOWN && wParam == VK_F2 )
SetActive( false );
return 0;
}
//--------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnLostDevice()
{
SAFE_RELEASE( m_pStateBlock );
return S_OK;
}
//--------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnDestroyDevice()
{
return S_OK;
}
//--------------------------------------------------------------------------------------
void WINAPI CD3DSettingsDlg::StaticOnEvent( UINT nEvent, int nControlID,
CDXUTControl* pControl, void* pUserData )
{
CD3DSettingsDlg* pD3DSettings = (CD3DSettingsDlg*) pUserData;
if( pD3DSettings )
pD3DSettings->OnEvent( nEvent, nControlID, pControl );
}
//--------------------------------------------------------------------------------------
void CD3DSettingsDlg::OnEvent( UINT nEvent, int nControlID,
CDXUTControl* pControl )
{
switch( nControlID )
{
case DXUTSETTINGSDLG_ADAPTER: OnAdapterChanged(); break;
case DXUTSETTINGSDLG_DEVICE_TYPE: OnDeviceTypeChanged(); break;
case DXUTSETTINGSDLG_WINDOWED: OnWindowedFullScreenChanged(); break;
case DXUTSETTINGSDLG_FULLSCREEN: OnWindowedFullScreenChanged(); break;
case DXUTSETTINGSDLG_ADAPTER_FORMAT: OnAdapterFormatChanged(); break;
case DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL: OnAdapterFormatChanged(); break;
case DXUTSETTINGSDLG_RESOLUTION: OnResolutionChanged(); break;
case DXUTSETTINGSDLG_REFRESH_RATE: OnRefreshRateChanged(); break;
case DXUTSETTINGSDLG_BACK_BUFFER_FORMAT: OnBackBufferFormatChanged(); break;
case DXUTSETTINGSDLG_DEPTH_STENCIL: OnDepthStencilBufferFormatChanged(); break;
case DXUTSETTINGSDLG_MULTISAMPLE_TYPE: OnMultisampleTypeChanged(); break;
case DXUTSETTINGSDLG_MULTISAMPLE_QUALITY: OnMultisampleQualityChanged(); break;
case DXUTSETTINGSDLG_VERTEX_PROCESSING: OnVertexProcessingChanged(); break;
case DXUTSETTINGSDLG_PRESENT_INTERVAL: OnPresentIntervalChanged(); break;
case DXUTSETTINGSDLG_DEVICECLIP: OnDeviceClipChanged(); break;
case DXUTSETTINGSDLG_OK:
{
if( g_DeviceSettings.pp.Windowed )
{
g_DeviceSettings.pp.FullScreen_RefreshRateInHz = 0;
RECT rcClient;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -