65.9K
CodeProject 正在变化。 阅读更多。
Home

枚举和更改显示模式

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (5投票s)

2002 年 6 月 30 日

1分钟阅读

viewsIcon

104411

downloadIcon

3106

获取所有可能的显示模式,并使用 EnumDisplaySettings 和 ChangeDisplaySettings 函数进行更改。

Sample Image - enum_display_modes.jpg

引言

本文将简要介绍如何获取系统的所有可能的显示模式,包括当前模式,以及如何动态更改显示模式。

枚举所有模式

要获取系统上可用的所有显示模式,我们使用 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 设置为零调用该函数时缓存的信息。

当前的显示模式

要查找当前使用的显示模式,请将 EnumDisplaySettingsiModeNum 参数设置为 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 日 - 初始修订版

© . All rights reserved.