Нет поддержки масштабирования / фиксированного разрешения на выходе?

0

Я пишу программу Win32 C++ для изменения разрешения экрана и масштабирования различных машин. Я запускаю Windows 7, но нацелен на Windows XP. Программа работает на моем ноутбуке Windows 7 с точки зрения перечисления совместимых режимов отображения:

if (listModes)
{
    DEVMODE dmPossibleMode = { 0 };
    ZeroMemory(&dmPossibleMode, sizeof(dmPossibleMode));
    dmPossibleMode.dmSize = sizeof(dmPossibleMode);

    cout << "Key: BD = Bit density/Bits per pixel, SM = Scale mode" << endl;
    cout << "+-----+-----------+-------+----+----+" << endl;
    cout << "|  ID |   Dims    | Freq. | BD | SM |" << endl;
    cout << "+-----+-----------+-------+----+----+" << endl;
    for(int iModeNum = 0; EnumDisplaySettings(dd.DeviceName, iModeNum, &dmPossibleMode) != 0; iModeNum++)
    {
        ostringstream resString; resString << dmPossibleMode.dmPelsWidth << "x" << dmPossibleMode.dmPelsHeight;
        ostringstream freqString; freqString << dmPossibleMode.dmDisplayFrequency << "Hz";
        ostringstream bbpString; bbpString << dmPossibleMode.dmBitsPerPel;
        ostringstream scaleString; scaleString << dmPossibleMode.dmDisplayFixedOutput;
        cout << "|" << setw(4) << iModeNum << " ";
        cout << "|" << setw(10) << resString.str() << " ";
        cout << "|" << setw(6) << freqString.str() << " ";
        cout << "|" << setw(3) << bbpString.str() << " ";
        cout << "|" << setw(3) << scaleString.str() << " |" << endl;
    }
    cout << "+-----+-----------+-------+----+----+" << endl;
}

Дает мне:

+-----+-----------+-------+----+----+
|  ID |   Dims    | Freq. | BD | SM |
+-----+-----------+-------+----+----+
|   0 |   640x480 |  59Hz |  8 |  0 |
|   1 |   640x480 |  60Hz |  8 |  0 |
|   2 |   640x480 |  60Hz |  8 |  2 |
|   3 |   640x480 |  60Hz |  8 |  1 |
|   4 |   640x480 |  73Hz |  8 |  0 |
|   5 |   640x480 |  75Hz |  8 |  0 |
|   6 |   640x480 |  75Hz |  8 |  2 |
|   7 |   640x480 |  75Hz |  8 |  1 |
|   8 |   640x480 |  59Hz | 16 |  0 |
|   9 |   640x480 |  60Hz | 16 |  0 |
|  10 |   640x480 |  60Hz | 16 |  2 |
[ etc.                              ]

Но на рабочих столах Windows XP вывод выглядит следующим образом:

+-----+-----------+-------+----+----+
|  ID |   Dims    | Freq. | BD | SM |
+-----+-----------+-------+----+----+
|   0 |   640x480 |  59Hz |  8 |  0 |
|   1 |   640x480 |  60Hz |  8 |  0 |
|   2 |   640x480 |  60Hz |  8 |  0 |
|   3 |   640x480 |  60Hz |  8 |  0 |
|   4 |   640x480 |  73Hz |  8 |  0 |
|   5 |   640x480 |  75Hz |  8 |  0 |
|   6 |   640x480 |  75Hz |  8 |  0 |
|   7 |   640x480 |  75Hz |  8 |  0 |
|   8 |   640x480 |  59Hz | 16 |  0 |
|   9 |   640x480 |  60Hz | 16 |  0 |
|  10 |   640x480 |  60Hz | 16 |  0 |
[ etc.                              ]

Т.е. режим масштабирования все говорит "0". Может ли кто-нибудь дать представление о том, почему это может быть? Очень признателен!

  • 0
    Статья MSDN Library для EnumDisplaySettings () не обещает, что поле будет иметь значение, вы должны проверить dmFields. Спецификация драйвера видеоустройства была значительно пересмотрена в Vista с новой моделью драйвера под названием WDDM. Это, вероятно, как-то связано с этим.
  • 0
    Действительно, возможно ли определить поддерживаемые режимы масштабирования из API-интерфейсов Windows?
Теги:
visual-c++

1 ответ

1

Вы забыли проверить dmPossibleMode.dmFields на DM_DISPLAYFIXEDOUTPUT. Если этот бит не установлен, значение, которое вы используете на dmPossibleMode.dmDisplayFixedOutput, не было инициализировано, поэтому оно бесполезно проверяет его.

Если параметр DM_DISPLAYFIXEDOUTPUT не установлен, этот член должен быть равен нулю.

с http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565%28v=vs.85%29.aspx

Если я правильно помню, эти "растягивающие" значения имеют смысл только на экранах ноутбуков, но это может быть неправильно, не основываться на нем.

  • 0
    Это нужно установить только когда вы передаете структуру DEVMODE для применения настроек. Я использую EnumDisplaySettings в цикле, чтобы получить все свойства поддерживаемого режима. Я отмечаю, что в нем говорится, что он заполняет только dmBitsPerPel , dmPelsWidth , dmPelsHeight , dmDisplayFlags и dmDisplayFrequency - в этом случае мой вопрос теперь dmDisplayFrequency в том, как мне перечислить поддерживаемые режимы масштабирования ..? Я сейчас спросил это в другом месте.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню