枚举和更改显示模式






4.33/5 (5投票s)
2002 年 6 月 30 日
1分钟阅读

104411

3106
获取所有可能的显示模式,并使用 EnumDisplaySettings 和 ChangeDisplaySettings 函数进行更改。
引言
本文将简要介绍如何获取系统的所有可能的显示模式,包括当前模式,以及如何动态更改显示模式。
枚举所有模式
要获取系统上可用的所有显示模式,我们使用 EnumDisplaySettings
API 函数。
来自 MSDN
EnumDisplaySettings 函数检索显示设备的图形模式之一的信息。要检索显示设备的所有图形模式的信息,请对该函数进行一系列调用。
因此,要获取所有模式,我们需要调用此函数,直到它返回 FALSE。以下是代码:
BOOL bRetVal;
CString sDevMode;
iMode = 0;
do
{
bRetVal = ::EnumDisplaySettings(NULL, iMode, &devmode);
iMode++;
if (bRetVal)
{
sDevMode.Format("%d x %d, %d bits %dhtz",
devmode.dmPelsWidth, devmode.dmPelsHeight,
devmode.dmBitsPerPel, devmode.dmDisplayFrequency);
// list box for all modes (see demo)
if (m_lb1.AddString(sDevMode)==LB_ERR)
AfxMessageBox("An error occurred!!!");
}
}
while (bRetVal);
在上面的代码片段中,我们在每次后续调用 EnumDisplaySettings
之前递增 iModeNum
参数。根据 MSDN 的说法,图形模式索引从零开始,当您将 iModeNum
设置为零时调用 EnumDisplaySettings
时,操作系统会初始化并缓存有关显示设备的信息。当您使用 iModeNum
设置为非零值调用该函数时,该函数返回上次使用 iModeNum
设置为零调用该函数时缓存的信息。
当前的显示模式
要查找当前使用的显示模式,请将 EnumDisplaySettings
的 iModeNum
参数设置为 ENUM_CURRENT_SETTINGS
。
if (::EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode))
{
sDevMode.Format("%i x %i, %i bits %dhtz",
devmode.dmPelsWidth, devmode.dmPelsHeight,
devmode.dmBitsPerPel, devmode.dmDisplayFrequency);
m_lb1.SelectString(0, sDevMode);
}
更改模式
如果您想更改当前的显示模式,请使用 ChangeDisplaySettings
API 函数。
BOOL bRetVal;
iMode = m_lb1.GetCurSel();
bRetVal = ::EnumDisplaySettings(NULL, iMode, &devmode);
if (bRetVal)
{
devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT |
DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
::ChangeDisplaySettings(&devmode, 0);
}
结论
这段代码可用于 DirectX 编程,以确保显示适配器支持正确的模式。除此之外,在您的应用程序中更改用户的显示模式可能不是一个好主意。但由您决定。(不过,玩起来很有趣 :))。
修订历史
2002 年 6 月 30 日 - 初始修订版