以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 算法理论与分析 』 (http://bbs.xml.org.cn/list.asp?boardid=60) ---- 检测屏幕分辨率和颜色深度 (http://bbs.xml.org.cn/dispbbs.asp?boardid=60&rootid=&id=87761) |
-- 作者:葛靖青001 -- 发布时间:11/16/2010 11:59:00 AM -- 检测屏幕分辨率和颜色深度 【转自互联网,如需引用请联系原作者】 南京海军指挥学院 黄向明 ---- Windows API函数GetDeviceCaps()可提供广泛的关于设备背景的信息,其中包括屏幕分辨率和颜色深度。GUI程序设计允许将图形元素作为抽象的对象,不管硬件设备的情况及用户设置的选择。这对大多数情况,比如典型的窗口画面和设备无关位图操作都能满足。但是在某些特殊情况下将受到限制,程序员需要其它方法来获得相关设备的实际情况信息。本文就介绍一获取屏幕分辨率和颜色深度的应用程序。 ---- 一、GetDeviceCaps()的功能 ---- API函数GetDeviceCaps()可用来获取设备的很多信息,它也就成为应用和设备驱动程序的网关。下列为它在wingdi.h中的原型:int GetDeviceCaps(HDC hdc,int nIndex); ---- 第一项参数是与检测设备有关的设备背景,第二个参数表示检测值。函数的具体功能在Win32SDK文件中有详细介绍,本文集中介绍二个与显示设备最相关的特性:分辨率(水平和垂直)和能显示的不同颜色数。这些值能分别由HORZRES,VERTRES和BITSPIXEL返回给GetDeviceCaps()的第二个参数。BITSPIXEL返回描述一个像素颜色需要的位数,要确定实际颜色数只要计算以2作为幂的返回值的指数。 ---- 下列给出的C代码就是检测屏幕分辨率和颜色深度: /* 屏幕dc初始化*/ ---- 从上述代码看好象很简单,而且这在大多数情况下是可行的,但当在32K彩色模式时就不行了,在这种情况下GetDeviceCaps()返回16而不是期望的15(2^15是32,768)。另外,32K和64K颜色之间的区别(两者也作为"高-颜色方式")不大,当用15bit设备显示64K颜色位图时Windows应用抖动算法实现。那么,怎么能检测32K颜色情况和将它与64K情况区别开? ---- API函数比SetPixel(),以指定RGB颜色设置像素在设备背景上,还返回RGB值,而如果匹配不好的话,此返回的可能不是我们需要的颜色值。虽然,这一特性看上去没什么用处,但你可用它解决GetDeviceCaps()对15位颜色模式返回16位问题。如果用提供的RGB值设置一像素的颜色,并比较其返回的COLORREF,就能确定设备是否支持那种颜色。将上述算法放入一循环中,使RGB组合不断改变,设备既是视频卡,计算比较值为真的次数有多少。 ---- 显然,用上述方法要对SetPixel()调用2^24次在时间上是不合理的,其实并不需要在所有可能的值之中重复,分别比较每个颜色组合(先红色,然后绿色,然后蓝色)也可产生相同的结果,并且迭代次数可减少到255次。 ---- GetScrResolution()仅仅是对GetDeviceCaps(HORZRES)和GetDeviceCaps(VERTRES)的接连处理: BOOL GetScrResolution(WORD* pWidth, WORD* pHeight) *pWidth = GetDeviceCaps(screenDC, HORZRES); DeleteDC(screenDC); ---- GetScrColorDepth()调用GetDeviceCaps(BITSPIXEL),但是,当API返回16时,它使用 GetScrRGBBitsPerPixel()来依次计算红色、绿色和蓝色组合。如果他们都等于32,API返回代码16显然是不正确的,而实际上因是15。 screenDC = CreateDC("DISPLAY", NULL, NULL, NULL); if (numOfBits == 16) return numOfBits; GetScrRGBBitsPerPixel()通过255次循环测 BOOL GetScrRGBBitsPerPixel(WORD* pRedBits, *pRedBits = *pGreenBits = *pBlueBits = 1; screenDC = CreateDC("DISPLAY", NULL, { return !isError; |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
4,921.875ms |