2010-07-04 2 views
0

Я получаю странные результаты с помощью ChangeDisplaySettings и моей графической карты Intel. Я нахожу, что когда я пытаюсь войти в полноэкранный режим, он не будет делать это так же, как другие программы.Странные результаты с 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); 
}

Я хотел бы знать, если кто-то с интел карты имеет эту проблему.

Заранее благодарен!

ответ

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.

Смежные вопросы