⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dxutsettingsdlg.cpp

📁 DX例子中等难度的。全是新例子。VC2003
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    }

    const DWORD dwCurResolution = MAKELONG( g_DeviceSettings.pp.BackBufferWidth, 
                                            g_DeviceSettings.pp.BackBufferHeight );

    pResolutionComboBox->SetSelectedByData( ULongToPtr(dwCurResolution) );

    hr = OnResolutionChanged();
    if( FAILED(hr) )
        return hr;

    // DXUTSETTINGSDLG_BACK_BUFFER_FORMAT
    CDXUTComboBox* pBackBufferFormatComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT );
    pBackBufferFormatComboBox->RemoveAllItems();

    CD3DEnumDeviceInfo* pDeviceInfo = GetCurrentDeviceInfo();
    if( pDeviceInfo == NULL )
        return E_FAIL;

    const BOOL bWindowed = IsWindowed();
    bool bHasWindowedBackBuffer = false;

    for( int idc = 0; idc < pDeviceInfo->deviceSettingsComboList.GetSize(); idc++ )
    {
        CD3DEnumDeviceSettingsCombo* pDeviceCombo = pDeviceInfo->deviceSettingsComboList.GetAt( idc );
        if( pDeviceCombo->Windowed == bWindowed &&
            pDeviceCombo->AdapterFormat == g_DeviceSettings.AdapterFormat )
        {
            AddBackBufferFormat( pDeviceCombo->BackBufferFormat );
            bHasWindowedBackBuffer = true;
        }
    }

    pBackBufferFormatComboBox->SetSelectedByData( ULongToPtr(g_DeviceSettings.pp.BackBufferFormat) );

    hr = OnBackBufferFormatChanged();
    if( FAILED(hr) )
        return hr;

    if( !bHasWindowedBackBuffer )
    {
        m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_WINDOWED, false );

        if( g_DeviceSettings.pp.Windowed )
        {
            SetWindowed( false );

            hr = OnWindowedFullScreenChanged();
            if( FAILED(hr) )
                return hr;
        }
    }

    return S_OK;
}


//-------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnResolutionChanged()
{
    HRESULT hr = S_OK;

    CD3DEnumAdapterInfo* pAdapterInfo = GetCurrentAdapterInfo();
    if( pAdapterInfo == NULL )
        return E_FAIL;

    // Set resolution
    DWORD dwWidth, dwHeight;
    GetSelectedResolution( &dwWidth, &dwHeight );
    g_DeviceSettings.pp.BackBufferWidth = dwWidth;
    g_DeviceSettings.pp.BackBufferHeight = dwHeight;

    DWORD dwRefreshRate = g_DeviceSettings.pp.FullScreen_RefreshRateInHz;

    // Update the refresh rate list
    CDXUTComboBox* pRefreshRateComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_REFRESH_RATE );
    pRefreshRateComboBox->RemoveAllItems();

    D3DFORMAT adapterFormat = g_DeviceSettings.AdapterFormat;
    for( int idm = 0; idm < pAdapterInfo->displayModeList.GetSize(); idm++ )
    {
        D3DDISPLAYMODE displayMode = pAdapterInfo->displayModeList.GetAt( idm );

        if( displayMode.Format == adapterFormat &&
            displayMode.Width == dwWidth &&
            displayMode.Height == dwHeight )
        {
            AddRefreshRate( displayMode.RefreshRate );
        }
    }

    pRefreshRateComboBox->SetSelectedByData( ULongToPtr(dwRefreshRate) );

    hr = OnRefreshRateChanged();
    if( FAILED(hr) )
        return hr;

    return S_OK;
}


//-------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnRefreshRateChanged()
{
    // Set refresh rate
    g_DeviceSettings.pp.FullScreen_RefreshRateInHz = GetSelectedRefreshRate();

    return S_OK;
}


//-------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnBackBufferFormatChanged()
{
    HRESULT hr = S_OK;

    g_DeviceSettings.pp.BackBufferFormat = GetSelectedBackBufferFormat();
    
    D3DFORMAT adapterFormat = g_DeviceSettings.AdapterFormat;
    D3DFORMAT backBufferFormat = g_DeviceSettings.pp.BackBufferFormat;

    CD3DEnumDeviceInfo* pDeviceInfo = GetCurrentDeviceInfo();
    if( pDeviceInfo == NULL )
        return E_FAIL;

    bool bAllowSoftwareVP, bAllowHardwareVP, bAllowPureHardwareVP, bAllowMixedVP;
    DXUTGetEnumeration()->GetPossibleVertexProcessingList( &bAllowSoftwareVP, &bAllowHardwareVP, 
                                                           &bAllowPureHardwareVP, &bAllowMixedVP );
    
    for( int idc=0; idc < pDeviceInfo->deviceSettingsComboList.GetSize(); idc++ )
    {
        CD3DEnumDeviceSettingsCombo* pDeviceCombo = pDeviceInfo->deviceSettingsComboList.GetAt( idc );

        if( pDeviceCombo->Windowed == (g_DeviceSettings.pp.Windowed == TRUE) &&
            pDeviceCombo->AdapterFormat == adapterFormat &&
            pDeviceCombo->BackBufferFormat == backBufferFormat )
        {
            CDXUTComboBox* pDepthStencilComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL );
            pDepthStencilComboBox->RemoveAllItems();
            pDepthStencilComboBox->SetEnabled( (g_DeviceSettings.pp.EnableAutoDepthStencil == TRUE) ); 

            if( g_DeviceSettings.pp.EnableAutoDepthStencil )
            {
                for( int ifmt=0; ifmt < pDeviceCombo->depthStencilFormatList.GetSize(); ifmt++ )
                {
                    D3DFORMAT fmt = pDeviceCombo->depthStencilFormatList.GetAt( ifmt );

                    AddDepthStencilBufferFormat( fmt );
                }

                pDepthStencilComboBox->SetSelectedByData( ULongToPtr(g_DeviceSettings.pp.AutoDepthStencilFormat) );
            }
            else
            {
                if( !pDepthStencilComboBox->ContainsItem( L"(not used)" ) )
                    pDepthStencilComboBox->AddItem( L"(not used)", NULL );
            }

            hr = OnDepthStencilBufferFormatChanged();
            if( FAILED(hr) )
                return hr;

            CDXUTComboBox* pVertexProcessingComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_VERTEX_PROCESSING );
            pVertexProcessingComboBox->RemoveAllItems();

            // Add valid vertex processing types
            if( bAllowSoftwareVP )
                AddVertexProcessingType( D3DCREATE_SOFTWARE_VERTEXPROCESSING );

            if( bAllowHardwareVP && pDeviceInfo->Caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
                AddVertexProcessingType( D3DCREATE_HARDWARE_VERTEXPROCESSING );

            if( bAllowPureHardwareVP && pDeviceInfo->Caps.DevCaps & D3DDEVCAPS_PUREDEVICE )
                AddVertexProcessingType( D3DCREATE_PUREDEVICE );

            if( bAllowMixedVP && pDeviceInfo->Caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
                AddVertexProcessingType( D3DCREATE_MIXED_VERTEXPROCESSING );

            if( g_DeviceSettings.BehaviorFlags & D3DCREATE_PUREDEVICE )
                pVertexProcessingComboBox->SetSelectedByData( ULongToPtr(D3DCREATE_PUREDEVICE) );
            else if( g_DeviceSettings.BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING )
                pVertexProcessingComboBox->SetSelectedByData( ULongToPtr(D3DCREATE_SOFTWARE_VERTEXPROCESSING) );
            else if( g_DeviceSettings.BehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING )
                pVertexProcessingComboBox->SetSelectedByData( ULongToPtr(D3DCREATE_HARDWARE_VERTEXPROCESSING) );
            else if( g_DeviceSettings.BehaviorFlags & D3DCREATE_MIXED_VERTEXPROCESSING )
                pVertexProcessingComboBox->SetSelectedByData( ULongToPtr(D3DCREATE_MIXED_VERTEXPROCESSING) );

            hr = OnVertexProcessingChanged();
            if( FAILED(hr) )
                return hr;

            CDXUTComboBox* pPresentIntervalComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_PRESENT_INTERVAL );
            pPresentIntervalComboBox->RemoveAllItems();
            pPresentIntervalComboBox->AddItem( L"On", ULongToPtr(D3DPRESENT_INTERVAL_DEFAULT) );
            pPresentIntervalComboBox->AddItem( L"Off", ULongToPtr(D3DPRESENT_INTERVAL_IMMEDIATE) );

            pPresentIntervalComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.pp.PresentationInterval ) );
        
            hr = OnPresentIntervalChanged();
            if( FAILED(hr) )
                return hr;
        }
    }

    return S_OK;
}


//-------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnDepthStencilBufferFormatChanged()
{
    HRESULT hr = S_OK;

    D3DFORMAT depthStencilBufferFormat = GetSelectedDepthStencilBufferFormat();

    if( g_DeviceSettings.pp.EnableAutoDepthStencil )
        g_DeviceSettings.pp.AutoDepthStencilFormat = depthStencilBufferFormat;

    CD3DEnumDeviceSettingsCombo* pDeviceSettingsCombo = GetCurrentDeviceSettingsCombo();
    if( pDeviceSettingsCombo == NULL )
        return E_FAIL;
    
    CDXUTComboBox* pMultisampleTypeCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE );
    pMultisampleTypeCombo->RemoveAllItems();

    for( int ims=0; ims < pDeviceSettingsCombo->multiSampleTypeList.GetSize(); ims++ )
    {
        D3DMULTISAMPLE_TYPE msType = pDeviceSettingsCombo->multiSampleTypeList.GetAt( ims );

        bool bConflictFound = false;
        for( int iConf = 0; iConf < pDeviceSettingsCombo->DSMSConflictList.GetSize(); iConf++ )
        {
            CD3DEnumDSMSConflict DSMSConf = pDeviceSettingsCombo->DSMSConflictList.GetAt( iConf );
            if( DSMSConf.DSFormat == depthStencilBufferFormat &&
                DSMSConf.MSType == msType )
            {
                bConflictFound = true;
                break;
            }
        }

        if( !bConflictFound )
            AddMultisampleType( msType );
    }

    CDXUTComboBox* pMultisampleQualityCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE );
    pMultisampleQualityCombo->SetSelectedByData( ULongToPtr(g_DeviceSettings.pp.MultiSampleType) );

    hr = OnMultisampleTypeChanged();
    if( FAILED(hr) )
        return hr;

    return S_OK;
}


//-------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnMultisampleTypeChanged()
{
    HRESULT hr = S_OK;

    D3DMULTISAMPLE_TYPE multisampleType = GetSelectedMultisampleType();
    g_DeviceSettings.pp.MultiSampleType = multisampleType;

    CD3DEnumDeviceSettingsCombo* pDeviceSettingsCombo = GetCurrentDeviceSettingsCombo();
    if( pDeviceSettingsCombo == NULL )
        return E_FAIL;

    DWORD dwMaxQuality = 0;
    for( int iType = 0; iType < pDeviceSettingsCombo->multiSampleTypeList.GetSize(); iType++ )
    {
        D3DMULTISAMPLE_TYPE msType = pDeviceSettingsCombo->multiSampleTypeList.GetAt( iType );
        if( msType == multisampleType )
        {
            dwMaxQuality = pDeviceSettingsCombo->multiSampleQualityList.GetAt( iType );
            break;
        }
    }
   
    // DXUTSETTINGSDLG_MULTISAMPLE_QUALITY
    CDXUTComboBox* pMultisampleQualityCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY );
    pMultisampleQualityCombo->RemoveAllItems();

    for( UINT iQuality = 0; iQuality < dwMaxQuality; iQuality++ )
    {
        AddMultisampleQuality( iQuality );
    }

    pMultisampleQualityCombo->SetSelectedByData( ULongToPtr(g_DeviceSettings.pp.MultiSampleQuality) );

    hr = OnMultisampleQualityChanged();
    if( FAILED(hr) )
        return hr;

    return S_OK;
}


//-------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnMultisampleQualityChanged()
{
    g_DeviceSettings.pp.MultiSampleQuality = GetSelectedMultisampleQuality();

    return S_OK;
}


//-------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnVertexProcessingChanged()
{
    DWORD dwBehavior = g_DeviceSettings.BehaviorFlags;

    // Clear vertex processing flags
    dwBehavior &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING;
    dwBehavior &= ~D3DCREATE_SOFTWARE_VERTEXPROCESSING;
    dwBehavior &= ~D3DCREATE_MIXED_VERTEXPROCESSING;
    dwBehavior &= ~D3DCREATE_PUREDEVICE;

    // Determine new flags
    DWORD dwNewFlags = GetSelectedVertexProcessingType();
    if( dwNewFlags & D3DCREATE_PUREDEVICE )
        dwNewFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING;

    // Make changes
    g_DeviceSettings.BehaviorFlags = dwBehavior | dwNewFlags;

    return S_OK;
}


//-------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnPresentIntervalChanged()
{
    g_DeviceSettings.pp.PresentationInterval = GetSelectedPresentInterval();

    return S_OK;
}


//-------------------------------------------------------------------------------------
HRESULT CD3DSettingsDlg::OnDeviceClipChanged()
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -