如何改变系统当前显示器分辨率?
我想在我的程序运行中能够改变系统分辨率,在我的系统退出后又能够恢复原来的分辨率。如果系统不支持我设置的分辨率的话它也要能够自动恢复。如何实现?听说ChangeDisplaySettings函数可以,怎么用,有没有例子?

解决方案 »

  1.   

    如何在VC中修改显示参数
      在程序开发中,我们想让程序按照一定的显示参数运行。如何让程序自动修改当前的显示设置?在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的返回值作出更加详细的判断,以找出修改不成功的原因。 
      

  2.   

    改变屏幕的分辨率
    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);
      

  3.   

    先EnumDisplaySettings(),得到显示驱动支持的模式