📄 dxutsettingsdlg.cpp
字号:
//--------------------------------------------------------------------------------------
// File: DXUTSettingsDlg.cpp
//
// Dialog for selection of device settings
//
// Copyright (c) Microsoft Corporation. All rights reserved
//--------------------------------------------------------------------------------------
#include "DXUT.h"
#include "DXUTgui.h"
#include "DXUTsettingsDlg.h"
#undef min // use __min instead
#undef max // use __max instead
//--------------------------------------------------------------------------------------
// Internal functions forward declarations
//--------------------------------------------------------------------------------------
WCHAR* DXUTAPIVersionToString( DXUTDeviceVersion version );
WCHAR* DXUTPresentIntervalToString( UINT pi );
WCHAR* DXUTMultisampleTypeToString(D3DMULTISAMPLE_TYPE MultiSampleType);
WCHAR* DXUTD3DDeviceTypeToString(D3DDEVTYPE devType);
WCHAR* DXUTD3DX10DeviceTypeToString(D3D10_DRIVER_TYPE devType);
WCHAR* DXUTVertexProcessingTypeToString(DWORD vpt);
//--------------------------------------------------------------------------------------
// Global state
//--------------------------------------------------------------------------------------
DXUTDeviceSettings g_DeviceSettings;
CD3DSettingsDlg* WINAPI DXUTGetD3DSettingsDialog()
{
// Using an accessor function gives control of the construction order
static CD3DSettingsDlg dlg;
return &dlg;
}
//--------------------------------------------------------------------------------------
CD3DSettingsDlg::CD3DSettingsDlg()
{
m_pStateBlock = NULL;
m_bActive = false;
m_pActiveDialog = NULL;
}
//--------------------------------------------------------------------------------------
CD3DSettingsDlg::~CD3DSettingsDlg()
{
// Release the memory used to hold the D3D10 refresh data in the combo box
CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D10_REFRESH_RATE );
if( pComboBox )
for( UINT i = 0; i < pComboBox->GetNumItems(); ++i )
{
DXGI_RATIONAL *pRate = reinterpret_cast<DXGI_RATIONAL*>( pComboBox->GetItemData( i ) );
delete pRate;
}
}
//--------------------------------------------------------------------------------------
void CD3DSettingsDlg::Init( CDXUTDialogResourceManager* pManager )
{
assert( pManager );
m_Dialog.Init( pManager, false ); // Don't register this dialog.
m_RevertModeDialog.Init( pManager, false ); // Don't register this dialog.
m_pActiveDialog = &m_Dialog;
CreateControls();
}
//--------------------------------------------------------------------------------------
void CD3DSettingsDlg::Init( CDXUTDialogResourceManager* pManager, LPCWSTR szControlTextureFileName )
{
assert( pManager );
m_Dialog.Init( pManager, false, szControlTextureFileName ); // Don't register this dialog.
m_RevertModeDialog.Init( pManager, false, szControlTextureFileName ); // Don't register this dialog.
m_pActiveDialog = &m_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.
m_RevertModeDialog.Init( pManager, false, pszControlTextureResourcename, hModule ); // Don't register this dialog
m_pActiveDialog = &m_Dialog;
CreateControls();
}
//--------------------------------------------------------------------------------------
void CD3DSettingsDlg::CreateControls()
{
// Set up main settings dialog
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_API_VERSION
m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"API Version", 10, 35, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_API_VERSION, 200, 35, 300, 23 );
// DXUTSETTINGSDLG_ADAPTER
m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Display Adapter", 10, 60, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_ADAPTER, 200, 60, 300, 23 );
// DXUTSETTINGSDLG_DEVICE_TYPE
m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Render Device", 10, 85, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_DEVICE_TYPE, 200, 85, 300, 23 );
// DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_FULLSCREEN
m_Dialog.AddRadioButton( DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_WINDOWED_GROUP, L"Windowed", 240, 115, 300, 16 );
m_Dialog.AddCheckBox( DXUTSETTINGSDLG_DEVICECLIP, L"Clip to device when window spans across multiple monitors", 250, 136, 400, 16 );
m_Dialog.AddRadioButton( DXUTSETTINGSDLG_FULLSCREEN, DXUTSETTINGSDLG_WINDOWED_GROUP, L"Full Screen", 240, 157, 300, 16 );
// DXUTSETTINGSDLG_ADAPTER_FORMAT
m_Dialog.AddStatic( DXUTSETTINGSDLG_ADAPTER_FORMAT_LABEL, L"Adapter Format", 10, 175, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_ADAPTER_FORMAT, 200, 175, 300, 23 );
// DXUTSETTINGSDLG_RESOLUTION
m_Dialog.AddStatic( DXUTSETTINGSDLG_RESOLUTION_LABEL, L"Resolution", 10, 200, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_RESOLUTION, 200, 200, 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, 200, 200, 23, false );
// DXUTSETTINGSDLG_REFRESH_RATE
m_Dialog.AddStatic( DXUTSETTINGSDLG_REFRESH_RATE_LABEL, L"Refresh Rate", 10, 225, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_REFRESH_RATE, 200, 225, 300, 23 );
// DXUTSETTINGSDLG_BACK_BUFFER_FORMAT
m_Dialog.AddStatic( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT_LABEL, L"Back Buffer Format", 10, 260, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT, 200, 260, 300, 23 );
// DXUTSETTINGSDLG_DEPTH_STENCIL
m_Dialog.AddStatic( DXUTSETTINGSDLG_DEPTH_STENCIL_LABEL, L"Depth/Stencil Format", 10, 285, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL, 200, 285, 300, 23 );
// DXUTSETTINGSDLG_MULTISAMPLE_TYPE
m_Dialog.AddStatic( DXUTSETTINGSDLG_MULTISAMPLE_TYPE_LABEL, L"Multisample Type", 10, 310, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE, 200, 310, 300, 23 );
// DXUTSETTINGSDLG_MULTISAMPLE_QUALITY
m_Dialog.AddStatic( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY_LABEL, L"Multisample Quality", 10, 335, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY, 200, 335, 300, 23 );
// DXUTSETTINGSDLG_VERTEX_PROCESSING
m_Dialog.AddStatic( DXUTSETTINGSDLG_VERTEX_PROCESSING_LABEL, L"Vertex Processing", 10, 360, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_VERTEX_PROCESSING, 200, 360, 300, 23 );
// DXUTSETTINGSDLG_PRESENT_INTERVAL
m_Dialog.AddStatic( DXUTSETTINGSDLG_PRESENT_INTERVAL_LABEL, L"Vertical Sync", 10, 385, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_PRESENT_INTERVAL, 200, 385, 300, 23 );
// DXUTSETTINGSDLG_D3D10_ADAPTER_OUTPUT
m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D10_ADAPTER_OUTPUT_LABEL, L"Adapter Output", 10, 175, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D10_ADAPTER_OUTPUT, 200, 175, 300, 23 );
// DXUTSETTINGSDLG_D3D10_RESOLUTION
m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D10_RESOLUTION_LABEL, L"Resolution", 10, 200, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D10_RESOLUTION, 200, 200, 200, 23 );
m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D10_RESOLUTION )->SetDropHeight( 106 );
// DXUTSETTINGSDLG_D3D10_REFRESH_RATE
m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D10_REFRESH_RATE_LABEL, L"Refresh Rate", 10, 225, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D10_REFRESH_RATE, 200, 225, 300, 23 );
// DXUTSETTINGSDLG_D3D10_BACK_BUFFER_FORMAT
m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D10_BACK_BUFFER_FORMAT_LABEL, L"Back Buffer Format", 10, 260, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D10_BACK_BUFFER_FORMAT, 200, 260, 300, 23 );
// DXUTSETTINGSDLG_D3D10_MULTISAMPLE_COUNT
m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D10_MULTISAMPLE_COUNT_LABEL, L"Multisample Count", 10, 285, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D10_MULTISAMPLE_COUNT, 200, 285, 300, 23 );
// DXUTSETTINGSDLG_D3D10_MULTISAMPLE_QUALITY
m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D10_MULTISAMPLE_QUALITY_LABEL, L"Multisample Quality", 10, 310, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D10_MULTISAMPLE_QUALITY, 200, 310, 300, 23 );
// DXUTSETTINGSDLG_D3D10_PRESENT_INTERVAL
m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D10_PRESENT_INTERVAL_LABEL, L"Vertical Sync", 10, 335, 180, 23 );
m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D10_PRESENT_INTERVAL, 200, 335, 300, 23 );
// DXUTSETTINGSDLG_D3D10_DEBUG_DEVICE
m_Dialog.AddCheckBox( DXUTSETTINGSDLG_D3D10_DEBUG_DEVICE, L"Create Debug Device", 200, 365, 180, 23 );
// DXUTSETTINGSDLG_OK, DXUTSETTINGSDLG_CANCEL
m_Dialog.AddButton( DXUTSETTINGSDLG_OK, L"OK", 230, 440, 73, 31 );
m_Dialog.AddButton( DXUTSETTINGSDLG_CANCEL, L"Cancel", 315, 440, 73, 31, 0, true );
// Set up mode change dialog
m_RevertModeDialog.EnableKeyboardInput( true );
m_RevertModeDialog.EnableNonUserEvents( true );
m_RevertModeDialog.SetFont( 0, L"Arial", 15, FW_NORMAL );
m_RevertModeDialog.SetFont( 1, L"Arial", 28, FW_BOLD );
pElement = m_RevertModeDialog.GetDefaultElement( DXUT_CONTROL_STATIC, 0 );
if( pElement )
{
pElement->dwTextFormat = DT_VCENTER | DT_RIGHT;
// Title
CDXUTStatic* pStatic = NULL;
m_RevertModeDialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Do you want to keep these display settings?", 10, 5, 640, 50, false, &pStatic );
pElement = pStatic->GetElement( 0 );
pElement->iFont = 1;
pElement->dwTextFormat = DT_TOP | DT_LEFT;
// Timeout static text control
m_RevertModeDialog.AddStatic( DXUTSETTINGSDLG_STATIC_MODE_CHANGE_TIMEOUT, L"", 10, 90, 640, 30, false, &pStatic );
pElement = pStatic->GetElement( 0 );
pElement->iFont = 0;
pElement->dwTextFormat = DT_TOP | DT_LEFT;
}
// DXUTSETTINGSDLG_MODE_CHANGE_ACCEPT, DXUTSETTINGSDLG_MODE_CHANGE_REVERT
m_RevertModeDialog.AddButton( DXUTSETTINGSDLG_MODE_CHANGE_ACCEPT, L"Yes", 230, 50, 73, 31 );
m_RevertModeDialog.AddButton( DXUTSETTINGSDLG_MODE_CHANGE_REVERT, L"No", 315, 50, 73, 31, 0, true );
}
//--------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice )
{
if( pd3dDevice == NULL )
return DXUT_ERR_MSGBOX( L"CD3DSettingsDlg::OnCreatedDevice", E_INVALIDARG );
// Create the fonts/textures
m_Dialog.SetCallback( StaticOnEvent, (void*) this );
m_RevertModeDialog.SetCallback( StaticOnEvent, (void*) this );
return S_OK;
}
//--------------------------------------------------------------------------------------
// Changes the UI defaults to the current device settings
//--------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::Refresh()
{
HRESULT hr = S_OK;
g_DeviceSettings = DXUTGetDeviceSettings();
CDXUTComboBox *pAPIComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_API_VERSION );
pAPIComboBox->RemoveAllItems();
if( DXUTDoesAppSupportD3D9() )
{
// Ensure that at least one adapter got enumerated.
CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration();
if( pD3DEnum->GetAdapterInfoList()->GetSize() > 0 )
AddAPIVersion( DXUT_D3D9_DEVICE );
}
if( DXUTDoesAppSupportD3D10() && DXUTIsD3D10Available() )
{
// Ensure that at least one adapter got enumerated.
CD3D10Enumeration* pD3DEnum = DXUTGetD3D10Enumeration();
if( pD3DEnum->GetAdapterInfoList()->GetSize() > 0 )
AddAPIVersion( DXUT_D3D10_DEVICE );
}
// If no API has been added, something has gone wrong. Exit the dialog.
if( pAPIComboBox->GetNumItems() == 0 )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -