c++ - 不支持缩放/固定输出分辨率?

标签 c++ visual-c++

我正在编写一个 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/

相关文章:

c++ - 内联汇编中的弱符号和自定义部分

c++ - 将一系列 h264 帧写入多个文件

visual-c++ - OnTimer 仅重复第一个函数调用

c++ - 更改代码生成后以代码 255 退出的特定代码行

c++ - 编写针对 IE7 的 BHO

使用 C# 进行 C++ 单元测试

c++ - 在 C++ 中,如果复制一个对象是可能的,但确实很昂贵而且通常不是一个好主意,您是否仍然应该使用复制构造函数来实现复制?

c++ - 亚洲 : how to pass object from one io context to another

c++ - VC++ 6.0 中的调试与发布行为之谜

c++ - 如何将文件传递给函数?