如何改变系统当前显示器分辨率?
我想在我的程序运行中能够改变系统分辨率,在我的系统退出后又能够恢复原来的分辨率。如果系统不支持我设置的分辨率的话它也要能够自动恢复。如何实现?听说ChangeDisplaySettings函数可以,怎么用,有没有例子?
我想在我的程序运行中能够改变系统分辨率,在我的系统退出后又能够恢复原来的分辨率。如果系统不支持我设置的分辨率的话它也要能够自动恢复。如何实现?听说ChangeDisplaySettings函数可以,怎么用,有没有例子?
在程序开发中,我们想让程序按照一定的显示参数运行。如何让程序自动修改当前的显示设置?在VC中提供了修改显示设备(如显示器、打印机等等,本文只就显示器而言)属性的函数:ChangeDisplaySettings,该函数能够按照你的需要对显示设备作出相应的修改。其函数申明如下:LONG ChangeDisplaySettings(
LPDEVMODE lpDevMode,
DWORD dwflags
);其参数的含义如下:lpDevMode:一个指向DEVMODE数据结构的指针,DEVMODE的数据结构描述了欲设定显示器的各类属性值。通常情况下使用到的参数有:dmSize:所用DEVMODE数据结构的大小(以Bytes为单位)
dmBitsPerPel :每象素所使用的显存位数(Bits)
dmPelsWidth Pixel width :水平分辨率(点数)
dmPelsHeight Pixel height :垂直分辨率(点数)
dmDisplayFrequency Mode frequency :显示刷新率,以赫兹为单位dmFields:通常情况下,不同的显示设备(如打印机)用到的DEVMODE数据结构的内容不同,比如设定打印机时,你不会用到dmDisplayFrequency属性。所以,在你使用DEVMODE数据结构时,应向系统说明你具体用到的有效数据成员,dmFields的用处便在于此。如果在程序中只用到dmPelsWidth(水平分辨率)和dmPelsHeight(垂直分辨率),那么该值应为DM_PELSWIDTH|DM_PELSHEIGHT。Dwflags:表明对显示设备的修改方式。具体取值有以下几种:0 :动态改变显示设备属性
CDS_UPDATEREGISTRY:动态改变显示设备属性并修改注册表相关设置,下次启动计算机时,本次所做的修改依然有效
CDS_TEST:测试所做的修改是否有效该函数的返回值:DISP_CHANGE_SUCCESSFUL:修改成功
DISP_CHANGE_RESTART :修改后需重新启动(在显示器设定中选择了“应用新的颜色前重新启动计算机”)
DISP_CHANGE_FAILED :修改失败
DISP_CHANGE_BADMODE:修改模式错误(比如你的显示器是单色的,但你却将之修改为256色的)
当If lpDevMode为NULL且dwflags 为0时, 显示设备使用注册表当前值。
以上是ChangeDisplaySettings常见的用法,更详细的参数说明请参见MSDN。下面举一具体的例子来说明在VC中如何修改显示器的分辨率和色彩。假设我们想将当前显示器的分辨率设为800X600,并使用24位色(色彩为224种)。步骤1、新建一MFC AppWizard项目,本文为节约篇幅起见,在向导的第一步中选择基于对话框(Dialog Baseed)的程序。在向导的其余步骤中全部使用默认值。步骤2、在对话框中新添加一按钮,标题设为“测试”。步骤3、双击“测试”按钮,系统提示新建一函数OnButton1对应于该按钮的CLICK事件。OnButton1函数的具体代码如下:
void CChange_fenbianDlg::OnButton1()
{
DEVMODE lpDevMode;
lpDevMode.dmBitsPerPel=24;
lpDevMode.dmPelsWidth=800;
lpDevMode.dmPelsHeight=600;
lpDevMode.dmSize=sizeof(lpDevMode);
lpDevMode.dmFields =DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL;
LONG result;
result=ChangeDisplaySettings(&lpDevMode,0);
if (result==DISP_CHANGE_SUCCESSFUL)
{
AfxMessageBox("修改成功!");
ChangeDisplaySettings(&lpDevMode,CDS_UPDATEREGISTRY);
//使用CDS_UPDATEREGISTRY表示次修改是持久的,
//并在注册表中写入了相关的数据
}
else
{
AfxMessageBox("修改失败,恢复原有设置!");
ChangeDisplaySettings(NULL,0);
}
}说明:上述函数中对ChangeDisplaySettings的返回值result没有作过多的分析,在实际操作中出于程序稳健的角度出发,可以对ChangeDisplaySettings的返回值作出更加详细的判断,以找出修改不成功的原因。
DEVMODE lpDevMode;
lpDevMode.dmBitsPerPel=32;//修改为32位颜色
lpDevMode.dmPelsWidth=1024;//分辨率X为1024
lpDevMode.dmDisplayFrequency=85;//刷新率为85HZ
lpDevMode.dmPelsHeight=768;//分辨率Y为768
lpDevMode.dmSize=sizeof(lpDevMode);
lpDevMode.dmFields =DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL|DM_DISPLAYFREQUENCY;
ChangeDisplaySettings(&lpDevMode,1);
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=118824得到分辨率可以用
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);