Странные результаты с ChangeDisplaySettings и видеокартой Intel - PullRequest
0 голосов
/ 04 июля 2010

Я получаю странные результаты с ChangeDisplaySettings и моей видеокартой Intel.Я обнаружил, что когда я пытаюсь перейти в полноэкранный режим, он не будет делать это так же, как другие программы.

Моя панель управления Intel позволяет обрабатывать различные разрешения тремя способами: растягивать изображение, используя исходное разрешение, но центрировать изображение, или сохранять пропорции с помощью почтового ящика.Я установил значение по умолчанию для поддержания соотношения сторон, и некоторые старые игры на моем компьютере в конечном итоге делают это.Тем не менее, моя программа не будет делать то же самое.Вместо этого он центрируется.

Вот код, который я использую:

#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);
}

Я хотел бы знать, есть ли у кого-нибудь еще с картой Intel такая проблема.1009 *

Заранее спасибо!

1 Ответ

1 голос
/ 05 июля 2010

Я попробовал более простую функцию, и это больше, чем я ожидал на этот раз:


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.

...