2010-11-03 38 views
10

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

我很确定这是可能的WINDOWS API。我只是不知道该怎么做。

哦,请减少一些松懈,我熟悉QT4和C++,但我通常是一个Linux程序员,我正在写这个给其他人。我所做过的唯一一件事情就是创建一个消息框,设置背景和使用系统变量。所以请简单说明一下过程。请不要只发布一个链接到msdn,我讨厌他们的文档,我讨厌微软。我每年使用两次窗户。

+0

你自己限制在Win32 API中的任何原因? DirectX API封装了这个功能,所以你不必处理不同的图形卡供应商。 – 2010-11-03 16:17:37

+6

“请不要只发布msdn的链接,我讨厌他们的文档,而且我讨厌微软。” 真的!? MSDN文档通常很棒。 – James 2010-11-03 17:06:12

回答

17

下面应该为你在一般情况下大概工作

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

这正是我想要的,我不明白,每个模式编号是每个支持资源,并且0是最新的,谢谢 – 2010-11-03 16:42:03

+0

是不是有趣的是,我可以看一些示例代码,并理解它比阅读msdn的信息 – 2010-11-03 17:13:29

+0

@TheDude每个人都有不同的学习风格。你和我的似乎是'通过实例学习'。 – deed02392 2014-04-01 14:26:06

2

EnumDisplaySettings :)

从MSDN:

“为了获得当前显示设置,通过ENUM_CURRENT_SETTINGS在iModeNum参数到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的链接,提问者明确表示他不感兴趣... – 2010-11-03 16:17:58

+0

@FrédéricHamidi。我添加了一个例子。 – YWE 2010-11-03 16:26:17

+0

我看不出“The Dude”在哪里说。他说,“Windows API”和链接指向GDI中的一个函数,这是Windows API的一部分。在我看来,这正是所要求的。 – 2010-11-03 16:26:54