【问题标题】:Strange Results with ChangeDisplaySettings and Intel graphics cardChangeDisplaySettings 和 Intel 显卡的奇怪结果
【发布时间】:2010-07-05 08:03:56
【问题描述】:

我在使用 ChangeDisplaySettings 和我的英特尔显卡时得到了奇怪的结果。我发现当我尝试全屏时,它不会像其他程序那样做。

我的英特尔控制面板可让我以 3 种方式处理不同的分辨率:拉伸图像、使用原始分辨率但居中图像,或使用信箱处理保持纵横比。我将默认设置为保持纵横比,而我电脑上的一些旧游戏最终会这样做。但是,我的程序不会这样做。相反,它会居中。

这是我正在使用的代码:

#include "windows.h"
DEVMODE DevMode;
DEVMODE UsedDevMode;  
struct stOptions
{
    char szFiles[260];
    int xres;
    int yres;
    int bpp;
    bool bMultiMon;
};
stOptions options;

void ApplyOptions(HWND hWnd)
{
    int iModeNum=0;
    bool bRes, bBpp, bFreq;
    bRes=bBpp=bFreq=false;
    bool bResult=true;
    bool bChanged=false;
    int iFreq;
    EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &DevMode); //Get the current frequency
    iFreq=DevMode.dmDisplayFrequency;  
    //With this, I try to find a DevMode that will work for the display. If it can't match all of the user's
    //preferences, it will at least try to match as much as it can.
    while (bResult)
    {
        bResult=EnumDisplaySettings(NULL, iModeNum, &DevMode);
        if ((DevMode.dmPelsWidth==options.xres)&&(DevMode.dmPelsHeight==options.yres))
        {
            if (!bRes) EnumDisplaySettings(NULL, iModeNum, &UsedDevMode);
            bRes=true; bChanged=true;
            if (DevMode.dmBitsPerPel==options.bpp)
            {
                if (!bBpp) EnumDisplaySettings(NULL, iModeNum, &UsedDevMode);
                bBpp=true;
                if (DevMode.dmDisplayFrequency==iFreq)
                {
                    EnumDisplaySettings(NULL, iModeNum, &UsedDevMode);
                    bFreq=true;
                    break;
                }
            }
        }
        iModeNum++;
    }  
    if (!bChanged)
    {
        //TODO: add error handling
    }  
    ChangeDisplaySettings(&UsedDevMode, CDS_FULLSCREEN);
    MoveWindow(hWnd, 0, 0, options.xres, options.yres, true);
}

我想知道其他有英特尔卡的人是否有这个问题。

提前致谢!

【问题讨论】:

    标签: windows visual-c++ opengl fullscreen


    【解决方案1】:

    我尝试了一个更简单的功能,这次它更像我的预期:

    
    void ApplyOptions(HWND hWnd)
    {
        DEVMODE dmScreenSettings;                                           // Device Mode
        ZeroMemory (&dmScreenSettings, sizeof (DEVMODE));                   // Make Sure Memory Is Cleared
        dmScreenSettings.dmSize             = sizeof (DEVMODE);             // Size Of The Devmode Structure
        dmScreenSettings.dmPelsWidth        = options.xres;                     // Select Screen Width
        dmScreenSettings.dmPelsHeight       = options.yres;                     // Select Screen Height
        dmScreenSettings.dmBitsPerPel       = options.bpp;                  // Select Bits Per Pixel
        dmScreenSettings.dmFields           = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
        if (ChangeDisplaySettings (&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
        {
            MessageBox(NULL, "Fail", "Error", MB_ICONHAND);
        }
    
        //ChangeDisplaySettings(&UsedDevMode, CDS_FULLSCREEN);
        MoveWindow(hWnd, 0, 0, options.xres, options.yres, true);
    }

    我仍然不知道为什么会有所不同,但我想这与dmScreenSettings.dmFields有关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      • 2015-01-13
      • 2018-05-28
      • 1970-01-01
      • 2012-10-10
      • 2015-04-14
      • 1970-01-01
      相关资源
      最近更新 更多