Я пишу программу 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". Может ли кто-нибудь дать представление о том, почему это может быть? Очень признателен!
Вы забыли проверить dmPossibleMode.dmFields
на DM_DISPLAYFIXEDOUTPUT
. Если этот бит не установлен, значение, которое вы используете на dmPossibleMode.dmDisplayFixedOutput
, не было инициализировано, поэтому оно бесполезно проверяет его.
Если параметр DM_DISPLAYFIXEDOUTPUT не установлен, этот член должен быть равен нулю.
с http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565%28v=vs.85%29.aspx
Если я правильно помню, эти "растягивающие" значения имеют смысл только на экранах ноутбуков, но это может быть неправильно, не основываться на нем.
EnumDisplaySettings
в цикле, чтобы получить все свойства поддерживаемого режима. Я отмечаю, что в нем говорится, что он заполняет только dmBitsPerPel
, dmPelsWidth
, dmPelsHeight
, dmDisplayFlags
и dmDisplayFrequency
- в этом случае мой вопрос теперь dmDisplayFrequency
в том, как мне перечислить поддерживаемые режимы масштабирования ..? Я сейчас спросил это в другом месте.