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

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

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

【 tulaoshi.com - 编程语言 】

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

  一、相关原理

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

  在VC中提供了修改显示设备(如显示器、打印机等等,本文只就显示器而言)属性的函数:ChangeDisplaySettings,该函数能够按照你的需要对显示设备作出相应的修改。其函数申明如下:

  LONG ChangeDisplaySettings(
  LPDEVMODE lpDevMode,
  DWORD dwflags
  );

  其参数的含义如下:

  lpDevMode:一个指向DEVMODE数据结构的指针,DEVMODE的数据结构描述了欲设定显示器的各类属性值。通常情况下使用到的参数有:

  dmSize:所用DEVMODE数据结构的大小(以Bytes为单位)

  dmBitsPerPel :每象素所使用的显存位数(Bits)

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

  dmPelsWidth Pixel width :水平分辨率(点数)

  dmPelsHeight Pixel height :垂直分辨率(点数)

  dmDisplayFrequency Mode frequency :显示刷新率,以赫兹为单位

  dmFields:通常情况下,不同的显示设备(如打印机)用到的DEVMODE数据结构的内容不同,比如设定打印机时,你不会用到dmDisplayFrequency属性。所以,在你使用DEVMODE数据结构时,应向系统说明你具体用到的有效数据成员,dmFields的用处便在于此。如果在程序中只用到dmPelsWidth(水平分辨率)和dmPelsHeight(垂直分辨率),那么该值应为DM_PELSWIDTH|DM_PELSHEIGHT。

  Dwflags:表明对显示设备的修改方式。具体取值有以下几种:

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

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

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

延伸阅读
Windows 7上如何调整显示器分辨率 介绍一下显示器分辨率调整方法,以Windows 7操作系统为例,在桌面空白处,点击鼠标右键,在弹出菜单中选择屏幕分辨率。 如下图,点击分辨率列表框,可以看到当前显示分辨率支持情况,选择后点击确定即可。 2、Windows XP上如何调整显示器分辨率? 如果是Windows XP系统,修改分辨率...
标签: 电脑入门
首先我们来了解下什么是分辨率? 分辨率(resolution,港台称之为解析度)就是屏幕图像的精密度,是指显示器所能显示的像素的多少。由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。可以把整个图像想象成是一个大型的棋盘,而分辨率...
标签: 电脑 显示器
1、价格 在店里最好的定价模式之前,确保它要提供你所需要的。如果你是一个严重的玩家或视频或图像处理软件的使用电脑的计划,确保该决议能够顺利运行程序。你也应该考虑保修,许多低质量的显示器可能售价低于顶级品牌,但其担保通常都不太理想。 2、尺寸 之前抢在店里最大的显示器和运行的大门,想想你在家的空间。您的...
标签: autocad教程
    先将“DISPLAY”层设为当前层,并将当前坐标系设为WCS。 22.4.1 创建屏幕     Auto CAD 提供了三种布尔运算,其中差集运算(SU BT RACT)可用于删除两实体间的公共部分。先创建两个长方体实体,然后在这两个长方体之间做差集运算。     选择“Solids(实体)”工具栏...
标签: PS PS教程
本文为中国合作伙伴印象特别供稿,转载必须取得授权 1.新建一600*600的空白画布。 2.先图层面版上新建一层,然后将前景色定义为25%的灰色,使用“圆角矩形工具”在画布上画出一圆角矩形。如图a1。 730)this.width=730;" border=0> 3.使用加深工具,均匀的在矩形的边缘涂抹。加深工具设置如图1。效果如图a2。   730)this.width=730;"...

经验教程

982

收藏

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