当前位置: 源码素材网 » VC++教程 » 详情页

VC++调整屏幕分辨率和显示模式

  •   时间:2019-06-11
  • 概述:分辨率 显示模式

有些程序需要特定的显示模式,于是需要在程序中动态地设置。本例就介绍如何设置屏幕分辨率。运行本例程序,选择屏幕颜色、刷新率和分辨率,然后单击【改变显示模式】按钮,屏幕分辨率就按照设定改变了。

显示器所显示的内容对应于显存,在显示器上最小的单位是像素(Pixel,这里仅考虑逻辑像素),显存的最小的单位是比特(Bit)。显示器工作的特征主要体现在色彩数和分辨率两方面。显示器所显示的色彩的数目取决于单位像素所使用的显存的比特数。在显存中,如果8bit 显存(即一个像素使用了一字节的显存)对应于显示器上的一个像素,那么显示器所显示的色彩数目为28=256 色;同样,如果当前的色彩为16 比特,那么显示器所显示的色彩数目为216=65536 种色彩。显示器的分辨率指的是水平分辨率和垂直分辨率,经常所说的800×600,就是指在水平方面上所显示的像素为800,在垂直方面上所显示的像素为600。显示器的刷新率是指显示器每秒钟刷新屏幕的次数,它的单位是“赫兹(Hertz)”。在VC 中提供了修改显示设备(如显示器、打印机等,本文只就显示器而言)属性的函数:ChangeDisplaySettings,该函数能够按照需要对显示设备作出相应的修改。其函数申明如下:

LONG ChangeDisplaySettings(
LPDEVMODE lpDevMode,
DWORD dwflags
);

其参数的含义如下:
lpDevMode:一个指向DEVMODE 数据结构的指针,DEVMODE 的数据结构设定了显示器的各类属性值。通常情况下使用到的参数如下。
dmSize:所用DEVMODE 数据结构的大小(以字节为单位)。
dmBitsPerPel:每像素所使用的显存比特数。
dmPelsWidth Pixel width :水平分辨率(点数)。
dmPelsHeight Pixel height :垂直分辨率(点数)。
dmDisplayFrequency Mode frequency :显示刷新率,以赫兹为单位。
Dwflags:表明对显示设备的修改方式。具体取值有以下几种。
0 :动态改变显示设备属性。
CDS_UPDATEREGISTRY:动态改变显示设备属性并修改注册表相关设置,下次启动计算机时,本次所做的修改依然有效。
CDS_TEST:测试所做的修改是否有效。
该函数的返回值如下:
DISP_CHANGE_SUCCESSFUL:修改成功。
DISP_CHANGE_RESTART :修改后需重新启动计算机(在显示器设定中选择了“应用新的颜色前重新启动计算机”)。
DISP_CHANGE_FAILED :修改失败。
DISP_CHANGE_BADMODE:修改模式错误(比如显示器是单色的,但却将之修改为256 色)。
当lpDevMode 为NULL 且dwflags 为0 时,显示设备使用注册表当前值。
以上是ChangeDisplaySettings 常见的用法,更详细的参数说明请参见MSDN。在程序中我们只需调用该函数即可。程序代码:
(1)通过 AppWizard 创建基于对话框的应用程序ChngDsplyMd。
(2)给对话框增加两个组合框控件和一个滑块控件,分别用来选择输入像素比特数、屏幕刷新率和屏幕分辨率。并通过ClassWizard 生成3 个对应的控件变量m_CtrlColor、m_CtrlFrequency 和m_CtrlDif。
(3)添加GetDisplayInfo 以获取当前的显示模式并初始化对话框中的控件,它的具体代码如下:

void CChngDsplyMdDlg::GetDisplayInfo() //获得显示信息并显示
{
CString strText;
int nIndex;
//获取显示信息
if(EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &m_DisplayMode))
{
switch(m_DisplayMode.dmBitsPerPel)
{
case 4: nIndex=0; break; //16 色
case 8: nIndex=1; break; //256 色
case 16: nIndex=2; break; //16 位
case 24: nIndex=3; break; //24 位
case 32: nIndex=4; break; //32 位
default: nIndex=0; //无
}
m_CtrlColor.SetCurSel(nIndex); //初始化IDC_COLOR 控件
strText.Format("%d", m_DisplayMode.dmDisplayFrequency);
nIndex=m_CtrlFrequency.FindString(-1, strText);
138
if(nIndex==CB_ERR) nIndex=0; //FindString 函数出错
m_CtrlFrequency.SetCurSel(nIndex); //初始化IDC_FREQUENCY 控件
nIndex=-1;
if(m_DisplayMode.dmPelsWidth==640 && m_DisplayMode.dmPelsHeight==480)
nIndex=0;
if(m_DisplayMode.dmPelsWidth==800 && m_DisplayMode.dmPelsHeight==600)
nIndex=1;
if(m_DisplayMode.dmPelsWidth==1024 && m_DisplayMode.dmPelsHeight==768)
nIndex=2;
if(m_DisplayMode.dmPelsWidth==1152 && m_DisplayMode.dmPelsHeight==864)
nIndex=3;
if(m_DisplayMode.dmPelsWidth==1280 && m_DisplayMode.dmPelsHeight==1024)
nIndex=4;
if(nIndex==-1) nIndex=0; //无该分辨率
m_CtrlDif.SetPos(nIndex); //初始化IDC_DIFFERENTIATE 控件
SetText();
}
}

(4)对话框中新添加一个按钮,标题设为“改变显示模式”。

(5)双击【改变显示模式】钮,系统提示新建一函数OnChagne 对应于该按钮的CLICK 事件。OnChagne 函数的具体代码如下:

void CChngDsplyMdDlg::OnChagne() //改变显示模式
{
long lResult;
GetData();
lResult=ChangeDisplaySettings(&m_DisplayMode, 0); //设置屏幕显示模式
if(lResult==DISP_CHANGE_SUCCESSFUL)
{
MessageBox("修改成功", NULL, MB_ICONINFORMATION | MB_OK);
//在注册表中写入相关数据
ChangeDisplaySettings(&m_DisplayMode, CDS_UPDATEREGISTRY);
}
else
{
ChangeDisplaySettings(NULL, 0);
GetDisplayInfo();
MessageBox("修改失败,恢复原有设置!\n 根据硬件情况不同,修改失败的原因不一样。",
NULL, MB_ICONSTOP | MB_OK);
}
}

    相关声明:

      若“VC++调整屏幕分辨率和显示模式”有损您的权益,请告之我们删除内容。
      部分文章来源于网络,版权归原作者所有。