在VC中修改显示器的分辩率和色彩

2016-02-19 18:40 39 1 收藏

今天图老师小编给大家展示的是在VC中修改显示器的分辩率和色彩,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - 编程语言 】

  在日常的程序开发中,有时我们想让自己编写的程序运行在显示器一定的分辨率和色彩数目下。如何让程序自动修改当前的显示器设置呢?这首先得从显示器的工作原理谈起。

  一、相关原理

  我们知道,显示器所显示的内容对应于显存,在显示器上最小的单位是象素(Pixel,这里仅考虑逻辑象素),显存的最小的单位是位(Bits)。 显示器工作的特征主要体现在色彩数和分辨率两方面。显示器所显示的色彩的数目取决于单位象素所使用的显存的位数(Bits)。在显存中,如果8位显存(即一个向象素使用了一字节的显存)对应于显示器上的一个象素,那么显示器所显示的色彩数目为28=256色;同样,如果当前的色彩为16位,那么显示器所显示的色彩数目为216=65536种色彩。显示器的分辨率指的是水平分辨率和垂直分辨率,经常所说的800X600,就是指在水平方面上所显示的象素为800个,在垂直方面上所显示的象素为600个。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  在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函数的具体代码如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  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的返回值作出更加详细的判断,以找出修改不成功的原因

来源:http://www.tulaoshi.com/n/20160219/1618581.html

延伸阅读
Windows95/98的注册表包含了Windows95/98的系统配置、PC机的硬件配置、Win32应用程序和用户的其他设置信息。注册表和INI文件不同,它是多层次的树状数据结构,具有六个分支(根键),每个分支又由许多的键和键值组成,而每个键则代表一个特定的配置项目。 在实际的编程工作中,我们遇到了如何在Visual C++中对Windows95/98注册表...
标签: 电脑入门
首先我们来了解下什么是分辨率? 分辨率(resolution,港台称之为解析度)就是屏幕图像的精密度,是指显示器所能显示的像素的多少。由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。可以把整个图像想象成是一个大型的棋盘,而分辨率...
1.显示器刷新率的设置:刷新率即场频,指每秒钟重复绘制画面的次数,以hz为单位。刷新率越高,画面显示越稳定,闪烁感就越小。一般人的眼睛对于 75hz以上的刷新率基本感觉不到闪烁,85hz以上则完全没有闪烁感,所以vesa国际视频协会将85hz逐行扫描制定为无闪烁标准。普通彩色电视机的刷新率只有50hz,目前电脑输出到显示器最低的刷新率是60hz,...
标签: 电脑 显示器
1、价格 在店里最好的定价模式之前,确保它要提供你所需要的。如果你是一个严重的玩家或视频或图像处理软件的使用电脑的计划,确保该决议能够顺利运行程序。你也应该考虑保修,许多低质量的显示器可能售价低于顶级品牌,但其担保通常都不太理想。 2、尺寸 之前抢在店里最大的显示器和运行的大门,想想你在家的空间。您的...
标签: autocad教程
    先将“DISPLAY”层设为当前层,并将当前坐标系设为WCS。 22.4.1 创建屏幕     Auto CAD 提供了三种布尔运算,其中差集运算(SU BT RACT)可用于删除两实体间的公共部分。先创建两个长方体实体,然后在这两个长方体之间做差集运算。     选择“Solids(实体)”工具栏...

经验教程

591

收藏

78
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部