不支持缩放/固定输出分辨率

No Scaling/Fixed Output Resolution support?

本文关键字:输出 分辨率 缩放 不支持      更新时间:2023-10-16

我正在编写一个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 处使用的值尚未初始化,因此检查它是毫无价值的。

如果未设置DM_DISPLAYFIXEDOUTPUT则此成员必须为零。

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

如果我没记错的话,这些"拉伸"值仅在笔记本电脑屏幕上有意义,但这可能是错误的,不要基于它。