我正在编写一个小程序让我来回切换分辨率,因为我的投影机无法处理与屏幕相同的分辨率。我已经知道如何使用Windows API设置屏幕分辨率。以及使用Windows API或QT4工具包读取当前分辨率。我的问题是我想要一个屏幕和显卡支持的所有不同分辨率的菜单。这个程序将被分发,所以我需要程序实际与图形卡通信,以找出它支持的内容。我想要使用的唯一API是Windows API或QT4工具包,但我不认为QT4会这样做,除非您以奇怪的方式使用图形小部件。
我很确定使用WINDOWS API可以实现这一点。我只是不知道该怎么做。
哦,请给我一些懈怠,我熟悉QT4和C ++,但我通常是一名Linux程序员,我正在为别人写这篇文章。我对Windows API做过的唯一事情就是创建一个消息框,设置背景,并使用系统变量。所以请简单解释一下这个过程。请不要只发布msdn的链接,我讨厌他们的文档,我讨厌微软。我一年两次使用Windows。
答案 0 :(得分: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而不仅仅是确定显示分辨率。
答案 1 :(得分:2)
来自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.
}