通常更改分辨率可以通过windows显示设置去更改,然而有些时候需要我们使用API进行修改。下面介绍这个函数的使用方法。
WINUSERAPI LONG WINAPI ChangeDisplaySettings(
_In_opt_ DEVMODEA* lpDevMode,
_In_ DWORD dwFlags);
该函数用户更改分辨率相关设置,参数1是设备名称,每一个显示其都有一个唯一标识的名称。
lpDevMode:指向一个描述转变图表的DEVMODE的指针。DEVMODE的dmSize参数必须依DEVMODE结构的大小、字节进行初始化,dmDriveExtra参数必须初始化来显示DEVMODE随后的驱动数据的字节数,另外还可以选用以下参数:
dmBitsPerPel每个像素的位数,dmPelsWidth屏幕宽度(像素),dmPelsHeight屏幕高度(像素),dmDisplayFlage模式标志。
dmDisplayFrequency模式频率。
dmposition在多显示配置中设备的位置(适用于Windows 98、Windows NT 5.0及以后版本)。
除了设置好DEVMOD结构中诸多元素的值之外,还必须要正确地设置dmFields元素中的标志。这些标志表明了DEVMODE结构中哪个元素在改变显示设置时使用了。如果在dmFields中没有设置正确的位,那么显示设置将不会发生变化。请设置好以下的标志:
DM_BITSPERPEL使用dmBitsPerPel的值,DM_PELSWIDTH使用dmPelsWidth的值,
DM_PELSHEIGHT使用dmPelsHeight的值,DM_DISPLAYFLAGS使用dmDisplayFlags的值,
DM_DISPLAYFREQUENCY使用dmDisplayFrequency的值。
DM_POSITION使用fdmPosition的值(适用于Windows98、WindowsNT5.0)。
如果lpDevMode为空。那么显示设置就使用注册表中的所有当前值。在显示模式动态地调整之后要想再回到缺省的模式,最简单的办法就是把lpDevMode参数置为空,使dwFlags参数置为0。
dwflags:表明了图形模式如何改变,它可能是如下的几种形式中的一种:
0:表明当前屏幕的图形模式要动态地改变。
CDS_UPDATEREGISTRY:表明当前屏幕的图形模式会动态地变化,并且该图形模式会更新注册表。该模式信息存贮在用户档案中。
CDS_TEST:系统检测是否要设置被请求的图形模式。
CDS_FULLSCREEN:从本质上讲该模式是暂时的。
CDS_GLOBAL:该设置保存在全局设置区域内, 因此它们会影响所有的用户。该标志仅在与标志一起使用时才有效。CDS_SET_PRIMARY:该设备成为首要设备。
CDS_RESET:设置要改变,即使请求的设置与当前设置一样。CDS_NORESET:设置保存在注册表中,但是它不起作用,该标志只有与CDS_UPDATEREGISTRY标志一起使用时才有效。
指定CDS_TEST允许一个应用确定哪个图形模式真正的有效。但并不会使系统变为那个有效的图形模式。
如果CDS_UPDATEREGISTRY被指定并且它可能会动态地改变图形模式。则注册表中保存该信息并且返回DISP_CHANGE_SUCCESSFUL如果不可能使用图形模式动态地改变,则注册表中保存该信息并且返回DISP_CHANGE_RESTART。
Windows NT:如果指定了CDS_UPDATEREGISTRY并且在注册表中不能保存该信息,则图形模式不会改变,并且返回DISP_CHANGE_NOTUPDATERD。
返回值:ChangeDisplaySettings函数的返回值如下:
DISP_CHANGE_SUCCESSFUL:设备改变成功。
DISP_CHANGE_RESTART:为使图形模式生效计算机必须重新启动。
DISP_CHANGE_BADFLAGS:标志的无效设置被传送。
DISP_CHANGE_NOTUPDATED:在WindowsNT中不能把设置写入注册表。
DISP_CHANGE_BADPARAM:一个无效的参数被传递。它可以包括一个无效的标志或标志的组合。
DISP_CHANGE_FAILED:指定图形模式的显示驱动失效。
DISP_CHANGE_BADMODE:不支持图形模式
为了保证传递给ChangeDisplaySetting的DEVMODE结构是有效的,并且仅包含显示驱动支持的值,可以使用由EnumDisplaySettings函数返回的DEVMODE。
当显示模式被动态地改变时,WM_DISPLAYCHANGE消息带着如下的消息参数传递给所有正在运行的应用:
wParam每像素点的新位数,LOWORD(lParam)新像素宽度,HIWORD(lParam)新像素高度。
速查:Windows NT:3.51及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:winuser.h;库文件:user32.lib;Unicode:在Windows NT上实现为Unicode和ANSI两种版本。
lpDevMode 可以使用EnumDisplaySettingsEx或者EnumDisplaySettings枚举出来
DEVMODE mode;
ZeroMemory(&mode, sizeof(mode));
mode.dmSize = sizeof(mode);
int i = 0;
bool result = EnumDisplaySettingsEx(NULL, i, &mode, 0);
然后就可以修改DEVMODE参数调用ChangeDisplaySettings来更改显示设置。
DEVMODE lpDevMode;
lpDevMode.dmPelsWidth=1366;
lpDevMode.dmPelsHeight=768;
LONG result;
result=ChangeDisplaySettings( &lpDevMode, 0);
if (result==DISP_CHANGE_SUCCESSFUL)
{
qDebug()<<QStringLiteral("修改成功!");
//使用CDS_UPDATEREGISTRY表示次修改是持久的
ChangeDisplaySettingsEx(&lpDevMode, CDS_UPDATEREGISTRY);
}
else
{
qDebug()<<QStringLiteral("修改失败,恢复原有设置!");
ChangeDisplaySettingsEx(NULL, 0);
}
}