【问题标题】:C++ Finding out what resolutions are supported by the graphics cardC++ 找出显卡支持的分辨率
【发布时间】:2010-11-03 16:08:40
【问题描述】:

我正在编写一个小程序来来回切换分辨率,因为我的投影仪无法处理与屏幕相同的分辨率。我已经知道如何使用 windows API 设置屏幕分辨率。以及使用 windows API 或 QT4 工具包读取当前分辨率。我的问题是我想要一个包含屏幕和显卡支持的所有不同分辨率的菜单。该程序将被分发,因此我需要该程序与显卡进行实际通信以了解它支持的内容。我想使用的唯一 API 是 windows API 或 QT4 工具包,但我认为 QT4 不会这样做,除非您以奇怪的方式使用图形小部件。

我很确定这可以通过 WINDOWS API 实现。我只是不知道该怎么做。

哦,请放慢我的脚步,我熟悉 QT4 和 C++,但我通常是一名 Linux 程序员,我正在为别人写这篇文章。我对 Windows API 所做的唯一一件事就是制作一个消息框、设置背景和使用系统变量。所以请简单解释一下过程。请不要只发布指向 msdn 的链接,我讨厌他们的文档,也讨厌 Microsoft。我每年可能会使用两次 Windows。

【问题讨论】:

  • 有什么原因让您受限于 Win32 API? DirectX API 封装了此功能,因此您不必与不同的显卡供应商打交道。
  • “请不要只发布指向 msdn 的链接,我讨厌他们的文档,也讨厌 Microsoft。”真的!? MSDN 文档通常很棒。

标签: c++ windows winapi qt4 resolution


【解决方案1】:

在一般情况下,以下内容可能对您有用

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;
  }

这应该会在运行 .exe 的当前显示器上打印出所有支持的分辨率。假设您不处理多显示器显卡,这应该可以工作。否则,您必须在每个显示器上使用 EnumDisplayDevices 循环。

确定所需的分辨率后,您可以使用“ChangeDisplaySettingsEx”将显示更改为所需的模式。

使用 DirectX 是可能的,但我不推荐它,因为代码要复杂得多(必须初始化 DirectX 并使用 COM 指针),除非您打算实际使用 DirectX 来确定显示分辨率。

【讨论】:

  • 这正是我想要的,我不明白每个模式号都是每个支持资源,而0是最新的,谢谢
  • 我可以看一些示例代码并比阅读 msdn 上的信息更好地理解它,这不是很有趣
  • @TheDude 每个人都有不同的学习方式。你和我的似乎是“以身作则”。
  • 我也使用了这个代码示例,但由于某种原因,我多次获得相同的分辨率。例如:mode0, mode1...modemode17 都显示 320x200,当另一个问题是,如果我进入“分辨率栏”,我的计算机允许的“最低”是 80​​0x600
【解决方案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.
}

【讨论】:

  • 有趣的是,您的答案中唯一的词是指向 MSDN 的链接,提问者明确表示他对此不感兴趣......
  • @Frédéric Hamidi。我添加了一个示例。
  • 我完全看不出“老兄”在哪里说过这句话。他说的是“Windows API”,链接指向 GDI 中的一个函数,它肯定是 Windows API 的一部分。在我看来,这正是所要求的。
  • 我已经知道如何获取当前屏幕信息。我想获得所有支持的分辨率。我没有想到directx,你能发一个例子或链接吗
  • @T.E.D.,提问者说Please don't just post a link to the msdn, I hate their documentation, and I hate Microsoft,我认为这很清楚:)
猜你喜欢
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多