C++ 查找图形卡支持的分辨率

9
我正在编写一个小程序,让我可以在我的投影仪无法处理与屏幕相同分辨率时进行分辨率的切换。我已经知道如何使用Windows API设置屏幕分辨率,以及使用Windows API或QT4工具包读取当前分辨率。我的问题是,我想要一个菜单,列出屏幕和显卡支持的所有不同分辨率。由于这个程序将被分发,所以我需要程序实际上与显卡通信以了解它支持什么。我只想使用Windows API或QT4工具包,但我认为QT4除非你以奇怪的方式使用图形小部件,否则不会这样做。
我很确定这可以通过WINDOWS API实现,只是我不知道该怎么做。
噢,请原谅我,我熟悉QT4和C ++,但我通常是一个Linux程序员,我为别人编写这个程序。我用Windows API唯一做过的事情就是制作消息框、设置背景并使用系统变量。所以请简单地解释一下这个过程。请不要只是发布到msdn的链接,我讨厌他们的文档,我也讨厌微软。我可能每年只用Windows两次。

你有什么理由仅限于使用Win32 API?DirectX API封装了这个功能,这样你就不必处理不同的图形卡供应商。 - Moo-Juice
7
请不要仅仅发布到MSDN链接,我讨厌他们的文档,也讨厌微软。真的吗?MSDN文档通常非常好。 - James
2个回答

18

以下在一般情况下可能适用于您

DEVMODE dm = { 0 };
dm.dmSize = sizeof(dm);
for( int iModeNum = 0; EnumDisplaySettings( NULL, iModeNum, &dm ) != 0; iModeNum++ ) {
  cout << "Mode #" << iModeNum << " = " << dm.dmPelsWidth << "x" << dm.dmPelsHeight << endl;
  }

以下代码应该会在当前显示器上打印出所有支持的分辨率。假设您没有使用多显示器显卡,那么这个代码应该就可以用了,否则您需要使用EnumDisplayDevices循环遍历每个显示器。

一旦你确定了想要的分辨率,你可以使用'ChangeDisplaySettingsEx'将显示器设置为所需的分辨率。

当然,您也可以使用DirectX,但是我不推荐这样做,因为代码更加复杂(需要初始化DirectX并使用COM指针),除非您计划实际上使用DirectX来确定显示器分辨率以外的其他功能。


这正是我想要的,我没有理解每个模式号是每个支持的分辨率,而0是当前的,谢谢。 - The Dude
1
有趣的是,我可以查看一些示例代码并比阅读 MSDN 上的信息更好地理解它。 - The Dude
@TheDude 每个人的学习方式都不同。你和我似乎是“通过示例学习”的。 - deed02392
我也使用了这个代码示例,但出现了一个问题,就是我多次得到相同的分辨率。例如:mode0、mode1...modemode17都显示为320x200,另一个问题是,如果我进入“分辨率栏”,我的电脑允许的最低分辨率是800x600。 - user1386966

2

EnumDisplaySettings :)

来自MSDN:

“要获取当前的显示设置,请在iModeNum参数中传递ENUM_CURRENT_SETTINGS常量到EnumDisplaySettings API,如下所示的C ++代码。”

DEVMODE dm;
// initialize the DEVMODE structure
ZeroMemory(&dm, sizeof(dm));
dm.dmSize = sizeof(dm);
if (0 != EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm))
{
// inspect the DEVMODE structure to obtain details
// about the display settings such as
//  - Orientation
//  - Width and Height
//  - Frequency
//  - etc.
}

2
有趣的是,你回答中唯一的词就是一个指向MSDN的链接,而提问者明确表示他对此不感兴趣... - Frédéric Hamidi
@Frédéric Hamidi。我添加了一个示例。 - YWE
我并没有看到"The Dude"说过那句话。他说的是"Windows API",而链接指向GDI中的一个函数,这显然是Windows API的一部分。在我看来,这恰好就是所要求的。 - T.E.D.
我已经知道如何获取当前屏幕信息。我想要获取所有支持的分辨率。我没有考虑到DirectX,你能发一个示例或链接吗? - The Dude
@T.E.D.,提问者说“请不要只是发布到msdn的链接,我讨厌他们的文档,也讨厌微软”,我认为这已经很清楚了 :) - Frédéric Hamidi
啊,我现在明白了。不知道我怎么会错过那个。可能是因为我看了太久的Slashdot,所以直接跳过了反微软的抱怨。 :-) - T.E.D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接