📄 d3dsettings.cpp
字号:
if( lstrcmp( strItem, pstrText ) == 0 )
return true;
}
return false;
}
//-----------------------------------------------------------------------------
// Name: ShowDialog
// Desc: Show the D3D settings dialog.
//-----------------------------------------------------------------------------
INT_PTR CD3DSettingsDialog::ShowDialog( HWND hwndParent )
{
return DialogBox( NULL, MAKEINTRESOURCE( IDD_SELECTDEVICE ),
hwndParent, DialogProcHelper );
}
//-----------------------------------------------------------------------------
// Name: DialogProc
// Desc: Handle window messages in the dialog.
//-----------------------------------------------------------------------------
INT_PTR CD3DSettingsDialog::DialogProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
UNREFERENCED_PARAMETER( lParam );
switch( msg )
{
case WM_INITDIALOG:
{
m_hDlg = hDlg;
// Fill adapter combo box. Updating the selected adapter will trigger
// updates of the rest of the dialog.
for( UINT iai = 0; iai < m_pEnumeration->m_pAdapterInfoList->GetArrayCount(); iai++ )
{
D3DAdapterInfo* pAdapterInfo;
pAdapterInfo = m_pEnumeration->m_pAdapterInfoList->Get(iai);
TCHAR strDescription[512];
// DXUtil_ConvertAnsiStringToGenericCch( strDescription, pAdapterInfo->AdapterIdentifier.Description, 512 );
strncpy(strDescription, pAdapterInfo->AdapterIdentifier.Description, 512);
ComboBoxAdd( IDC_ADAPTER_COMBO, pAdapterInfo, strDescription );
if( pAdapterInfo->AdapterOrdinal == m_d3dSettings.AdapterOrdinal() )
ComboBoxSelect( IDC_ADAPTER_COMBO, pAdapterInfo );
}
if( !ComboBoxSomethingSelected( IDC_ADAPTER_COMBO ) &&
ComboBoxCount( IDC_ADAPTER_COMBO ) > 0 )
{
ComboBoxSelectIndex( IDC_ADAPTER_COMBO, 0 );
}
}
return TRUE;
case WM_COMMAND:
switch( LOWORD(wParam) )
{
case IDOK:
EndDialog( hDlg, IDOK );
break;
case IDCANCEL:
EndDialog( hDlg, IDCANCEL );
break;
case IDC_ADAPTER_COMBO:
if( CBN_SELCHANGE == HIWORD(wParam) )
AdapterChanged();
break;
case IDC_DEVICE_COMBO:
if( CBN_SELCHANGE == HIWORD(wParam) )
DeviceChanged();
break;
case IDC_ADAPTERFORMAT_COMBO:
if( CBN_SELCHANGE == HIWORD(wParam) )
AdapterFormatChanged();
break;
case IDC_RESOLUTION_COMBO:
if( CBN_SELCHANGE == HIWORD(wParam) )
ResolutionChanged();
break;
case IDC_REFRESHRATE_COMBO:
if( CBN_SELCHANGE == HIWORD(wParam) )
RefreshRateChanged();
break;
case IDC_BACKBUFFERFORMAT_COMBO:
if( CBN_SELCHANGE == HIWORD(wParam) )
BackBufferFormatChanged();
break;
case IDC_DEPTHSTENCILBUFFERFORMAT_COMBO:
if( CBN_SELCHANGE == HIWORD(wParam) )
DepthStencilBufferFormatChanged();
break;
case IDC_MULTISAMPLE_COMBO:
if( CBN_SELCHANGE == HIWORD(wParam) )
MultisampleTypeChanged();
break;
case IDC_MULTISAMPLE_QUALITY_COMBO:
if( CBN_SELCHANGE == HIWORD(wParam) )
MultisampleQualityChanged();
break;
case IDC_VERTEXPROCESSING_COMBO:
if( CBN_SELCHANGE == HIWORD(wParam) )
VertexProcessingChanged();
break;
case IDC_PRESENTINTERVAL_COMBO:
if( CBN_SELCHANGE == HIWORD(wParam) )
PresentIntervalChanged();
break;
case IDC_WINDOW:
case IDC_FULLSCREEN:
WindowedFullscreenChanged();
break;
}
return TRUE;
default:
return FALSE;
}
}
//-----------------------------------------------------------------------------
// Name: AdapterChanged
// Desc: Respond to a change of selected adapter.
//-----------------------------------------------------------------------------
void CD3DSettingsDialog::AdapterChanged( void )
{
D3DAdapterInfo* pAdapterInfo = (D3DAdapterInfo*)ComboBoxSelected( IDC_ADAPTER_COMBO );
if( pAdapterInfo == NULL )
return;
if( m_d3dSettings.IsWindowed )
m_d3dSettings.pWindowed_AdapterInfo = pAdapterInfo;
else
m_d3dSettings.pFullscreen_AdapterInfo = pAdapterInfo;
// Update device combo box
ComboBoxClear( IDC_DEVICE_COMBO );
for( UINT idi = 0; idi < pAdapterInfo->pDeviceInfoList->GetArrayCount(); idi++ )
{
D3DDeviceInfo* pDeviceInfo = pAdapterInfo->pDeviceInfoList->Get(idi);
ComboBoxAdd( IDC_DEVICE_COMBO, pDeviceInfo,
D3DDevTypeToString( pDeviceInfo->DevType ) );
if( pDeviceInfo->DevType == m_d3dSettings.DevType() )
ComboBoxSelect( IDC_DEVICE_COMBO, pDeviceInfo );
}
if( !ComboBoxSomethingSelected( IDC_DEVICE_COMBO ) &&
ComboBoxCount( IDC_DEVICE_COMBO ) > 0 )
{
ComboBoxSelectIndex( IDC_DEVICE_COMBO, 0 );
}
}
//-----------------------------------------------------------------------------
// Name: DeviceChanged
// Desc: Respond to a change of selected device by resetting the
// fullscreen/windowed radio buttons. Updating these buttons will
// trigger updates of the rest of the dialog.
//-----------------------------------------------------------------------------
void CD3DSettingsDialog::DeviceChanged( void )
{
D3DDeviceInfo* pDeviceInfo = (D3DDeviceInfo*)ComboBoxSelected( IDC_DEVICE_COMBO );
if( pDeviceInfo == NULL )
return;
if( m_d3dSettings.IsWindowed )
m_d3dSettings.pWindowed_DeviceInfo = pDeviceInfo;
else
m_d3dSettings.pFullscreen_DeviceInfo = pDeviceInfo;
// Update fullscreen/windowed radio buttons
bool HasWindowedDeviceCombo = false;
bool HasFullscreenDeviceCombo = false;
for( UINT idc = 0; idc < pDeviceInfo->pDeviceComboList->GetArrayCount(); idc++ )
{
D3DDeviceCombo* pDeviceCombo = pDeviceInfo->pDeviceComboList->Get(idc);
if( pDeviceCombo->IsWindowed )
HasWindowedDeviceCombo = true;
else
HasFullscreenDeviceCombo = true;
}
EnableWindow( GetDlgItem( m_hDlg, IDC_WINDOW ), HasWindowedDeviceCombo );
EnableWindow( GetDlgItem( m_hDlg, IDC_FULLSCREEN ), HasFullscreenDeviceCombo );
if (m_d3dSettings.IsWindowed && HasWindowedDeviceCombo)
{
CheckRadioButton( m_hDlg, IDC_WINDOW, IDC_FULLSCREEN, IDC_WINDOW );
}
else
{
CheckRadioButton( m_hDlg, IDC_WINDOW, IDC_FULLSCREEN, IDC_FULLSCREEN );
}
WindowedFullscreenChanged();
}
//-----------------------------------------------------------------------------
// Name: WindowedFullscreenChanged
// Desc: Respond to a change of windowed/fullscreen state by rebuilding the
// adapter format list, resolution list, and refresh rate list.
// Updating the selected adapter format will trigger updates of the
// rest of the dialog.
//-----------------------------------------------------------------------------
void CD3DSettingsDialog::WindowedFullscreenChanged( void )
{
D3DAdapterInfo* pAdapterInfo = (D3DAdapterInfo*)ComboBoxSelected( IDC_ADAPTER_COMBO );
D3DDeviceInfo* pDeviceInfo = (D3DDeviceInfo*)ComboBoxSelected( IDC_DEVICE_COMBO );
if( pAdapterInfo == NULL || pDeviceInfo == NULL )
return;
if( IsDlgButtonChecked( m_hDlg, IDC_WINDOW ) )
{
m_d3dSettings.IsWindowed = true;
m_d3dSettings.pWindowed_AdapterInfo = pAdapterInfo;
m_d3dSettings.pWindowed_DeviceInfo = pDeviceInfo;
// Update adapter format combo box
ComboBoxClear( IDC_ADAPTERFORMAT_COMBO );
ComboBoxAdd( IDC_ADAPTERFORMAT_COMBO, (void*)m_d3dSettings.Windowed_DisplayMode.Format,
D3DUtil_D3DFormatToString( m_d3dSettings.Windowed_DisplayMode.Format ) );
ComboBoxSelectIndex( IDC_ADAPTERFORMAT_COMBO, 0 );
EnableWindow( GetDlgItem( m_hDlg, IDC_ADAPTERFORMAT_COMBO ), false );
// Update resolution combo box
DWORD dwResolutionData;
TCHAR strResolution[50];
dwResolutionData = MAKELONG( m_d3dSettings.Windowed_DisplayMode.Width,
m_d3dSettings.Windowed_DisplayMode.Height );
_sntprintf( strResolution, 50, TEXT("%d by %d"), m_d3dSettings.Windowed_DisplayMode.Width,
m_d3dSettings.Windowed_DisplayMode.Height );
strResolution[49] = 0;
ComboBoxClear( IDC_RESOLUTION_COMBO );
ComboBoxAdd( IDC_RESOLUTION_COMBO, ULongToPtr(dwResolutionData), strResolution );
ComboBoxSelectIndex( IDC_RESOLUTION_COMBO, 0 );
EnableWindow( GetDlgItem( m_hDlg, IDC_RESOLUTION_COMBO ), false );
// Update refresh rate combo box
TCHAR strRefreshRate[50];
if( m_d3dSettings.Windowed_DisplayMode.RefreshRate == 0 )
lstrcpy( strRefreshRate, TEXT("Default Rate") );
else
_sntprintf( strRefreshRate, 50, TEXT("%d Hz"), m_d3dSettings.Windowed_DisplayMode.RefreshRate );
strRefreshRate[49] = 0;
ComboBoxClear( IDC_REFRESHRATE_COMBO );
ComboBoxAdd( IDC_REFRESHRATE_COMBO, ULongToPtr(m_d3dSettings.Windowed_DisplayMode.RefreshRate),
strRefreshRate );
ComboBoxSelectIndex( IDC_REFRESHRATE_COMBO, 0 );
EnableWindow( GetDlgItem( m_hDlg, IDC_REFRESHRATE_COMBO ), false );
}
else
{
m_d3dSettings.IsWindowed = false;
m_d3dSettings.pFullscreen_AdapterInfo = pAdapterInfo;
m_d3dSettings.pFullscreen_DeviceInfo = pDeviceInfo;
// Update adapter format combo box
ComboBoxClear( IDC_ADAPTERFORMAT_COMBO );
for( UINT idc = 0; idc < pDeviceInfo->pDeviceComboList->GetArrayCount(); idc++ )
{
D3DDeviceCombo* pDeviceCombo = pDeviceInfo->pDeviceComboList->Get(idc);
D3DFORMAT adapterFormat = pDeviceCombo->AdapterFormat;
if( !ComboBoxContainsText( IDC_ADAPTERFORMAT_COMBO, D3DUtil_D3DFormatToString( adapterFormat ) ) )
{
ComboBoxAdd( IDC_ADAPTERFORMAT_COMBO, (void*)adapterFormat,
D3DUtil_D3DFormatToString( adapterFormat ) );
if( adapterFormat == m_d3dSettings.Fullscreen_DisplayMode.Format )
{
ComboBoxSelect( IDC_ADAPTERFORMAT_COMBO, (void*)adapterFormat );
}
}
}
if( !ComboBoxSomethingSelected( IDC_ADAPTERFORMAT_COMBO ) &&
ComboBoxCount( IDC_ADAPTERFORMAT_COMBO ) > 0 )
{
ComboBoxSelectIndex( IDC_ADAPTERFORMAT_COMBO, 0 );
}
EnableWindow( GetDlgItem( m_hDlg, IDC_ADAPTERFORMAT_COMBO), true );
// Update resolution combo box
EnableWindow( GetDlgItem( m_hDlg, IDC_RESOLUTION_COMBO), true );
// Update refresh rate combo box
EnableWindow( GetDlgItem( m_hDlg, IDC_REFRESHRATE_COMBO), true );
}
}
//-----------------------------------------------------------------------------
// Name: AdapterFormatChanged
// Desc: Respond to a change of selected adapter format by rebuilding the
// resolution list and back buffer format list. Updating the selected
// resolution and back buffer format will trigger updates of the rest
// of the dialog.
//-----------------------------------------------------------------------------
void CD3DSettingsDialog::AdapterFormatChanged( void )
{
if( !IsDlgButtonChecked( m_hDlg, IDC_WINDOW ) )
{
D3DAdapterInfo* pAdapterInfo = (D3DAdapterInfo*)ComboBoxSelected( IDC_ADAPTER_COMBO );
D3DFORMAT adapterFormat = (D3DFORMAT)PtrToUlong( ComboBoxSelected( IDC_ADAPTERFORMAT_COMBO ) );
m_d3dSettings.Fullscreen_DisplayMode.Format = adapterFormat;
ComboBoxClear( IDC_RESOLUTION_COMBO );
for( UINT idm = 0; idm < pAdapterInfo->pDisplayModeList->GetArrayCount(); idm++ )
{
D3DDISPLAYMODE displayMode = pAdapterInfo->pDisplayModeList->Get(idm);
if (displayMode.Format == adapterFormat)
{
DWORD dwResolutionData;
TCHAR strResolution[50];
dwResolutionData = MAKELONG( displayMode.Width, displayMode.Height );
_sntprintf( strResolution, 50, TEXT("%d by %d"), displayMode.Width, displayMode.Height );
strResolution[49] = 0;
if (!ComboBoxContainsText( IDC_RESOLUTION_COMBO, strResolution ) )
{
ComboBoxAdd( IDC_RESOLUTION_COMBO, ULongToPtr( dwResolutionData ), strResolution );
if (m_d3dSettings.Fullscreen_DisplayMode.Width == displayMode.Width &&
m_d3dSettings.Fullscreen_DisplayMode.Height == displayMode.Height)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -