显示原理理解 DEVMODE理解

今天查找DEVMODE结构的时候找到一篇不错的文章,特转过来:

显示器所显示的内容对应于显存,在显示器上最小的单位是象素(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);
   dmPelsWidth :水平分辨率(点数);
   dmPelsHeight Pixel height :垂直分辨率(点数);
   dmDisplayFrequency :显示刷新率,以赫兹为单位;
   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色的)。如果在函数调用时,参数lpDevMode为NULL且dwflags 为0, 则显示设备使用注册表当前值来设置显示特性。以上是ChangeDisplaySettings()函数的最常见的用法,更详细的说明请参见MSDN。

  对于系统的显示特性编程,还有一个关键的API函数EnumDisplaySettings()用来获得当前显示驱动所支持的所有显示模式。获得当前显示模式可以使用下面的函数:

Bool GetCurrentVideoSettings(DEVMODE *devmode)
{
 HWND hwndDesktop=GetDesktopWindow();
 HDC hdc=GetDC(hwndDesktop);
 devmode -> dmSize =sizeof(DEVMODE);
 devmode -> dmBitsPerPel=GetDeviceCaps(hdc,BITSPIXEL);
 devmode -> dmPelsWidth=GetSystemMetrics(SM_CXSCREEN);
 devmode -> dmPelsHeight=GetSystemMetrics(SM_CYSCREEN);
 devmode -> dmFields=DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
 return TRUE;
}

  下面的代码展示了如何使用EnumDisplaySettings获得当前支持的所有显示模式:

int modenum,done;
DEVMODE devmode;
done=0;
modenum=0;
do
{
 done=!EnumDisplaySettings(NULL,modenum,&devmode);
 AddToList(&devmode);
 modenum++;
}while (!done);

  设置显示模式的方法如下:

  rc = ChangeDisplaySettings(&devmode,CDS_FULLSCREEN));这里的devmode就是前面使用EnumDisplaySettings获得的。如果设置正常,返回值DISP_CHANGE_SUCCESSFUL。

 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个错误是由于 `win32print` 模块中没有名为 `DEVMODE` 的属性引起的。`DEVMODE` 是一个用于表示打印机设备模式的结构体,但在 `win32print` 模块中并没有直接提供该属性。 如果你想使用 `DEVMODE` 结构体来设置打印机设备模式,你可以使用 `pywintypes.DEVMODEType` 类来创建一个 `DEVMODE` 对象。下面是一个示例代码: ```python import win32print from pywintypes import DEVMODEType # 获取默认打印机 default_printer = win32print.GetDefaultPrinter() # 打开打印机 printer_handle = win32print.OpenPrinter(default_printer) # 获取打印机设备模式 devmode_info = win32print.GetPrinter(printer_handle, 2)['pDevMode'] devmode = DEVMODEType(devmode_info) # 修改打印机设备模式 devmode.Orientation = win32print.DMORIENT_LANDSCAPE # 设置打印方向为横向 # 更新打印机设置 win32print.DocumentProperties(0, printer_handle, default_printer, devmode, devmode, win32print.DM_IN_BUFFER | win32print.DM_OUT_BUFFER) # 关闭打印机 win32print.ClosePrinter(printer_handle) ``` 在这个示例中,我们使用 `win32print.GetPrinter()` 函数获取打印机的设备模式信息,并将其存储在 `devmode_info` 变量中。然后,我们使用 `pywintypes.DEVMODEType` 类来创建一个 `DEVMODE` 对象 `devmode`。 接下来,我们可以根据需要修改 `devmode` 对象中的打印机设备模式。在这个示例中,我们将打印方向设置为横向打印。 最后,我们使用 `win32print.DocumentProperties()` 函数将更新后的打印机设备模式应用到打印机上,并使用 `win32print.ClosePrinter()` 函数关闭打印机。 请注意,这只是一个示例代码,你需要根据具体的打印机和设置来调整代码。确保在修改打印机设置时谨慎操作,并确保了解打印机设置的具体含义和可用值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值