我正在编写一个 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”。谁能提供一些关于为什么会这样的见解?非常感谢!
最佳答案
您忘记根据 DM_DISPLAYFIXEDOUTPUT
检查 dmPossibleMode.dmFields
。如果该位未设置,则您在 dmPossibleMode.dmDisplayFixedOutput
中使用的值尚未初始化,因此检查它毫无意义。
If DM_DISPLAYFIXEDOUTPUT is not set, this member must be zero.
来自 http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565%28v=vs.85%29.aspx
如果我没记错的话,这些“拉伸(stretch)”值仅在笔记本电脑屏幕上有意义,但这可能是错误的,请不要以此为基础。
关于c++ - 不支持缩放/固定输出分辨率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22832468/