使用ChangeDisplaySettings和Intel显卡的奇怪结果

时间:2010-07-04 18:53:18

标签: windows visual-c++ opengl fullscreen

我使用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);
}

我想知道是否有其他知识产权卡有这个问题。

提前致谢!

1 个答案:

答案 0 :(得分: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有关。