屏幕分辨率

屏幕分辨率
近日翻看典著《Windows程序设计》,作者提起到“分辨率”(Resolution)一词时候,指出这个词其实是有两种含义的,一种就是我们广为熟悉的纵横像素数目表示法,另一种就是DPI,DPI在打印机和扫描仪领域更常用。

先说纵横像素数目表示法,我想我们都不会陌生,640*480,这是VGA的分辨率,800*600,这是15寸CRT常用分辨率,1024*768,这是17寸CRT常用分辨率,1280*1024,这是17寸和19寸LCD额定分辨率,而目前主流的24寸16:10的LCD的额定分辨率则是1920*1200。

对于DPI,我们可能相对陌生一点,其实DPI就是像素每英寸,为什么是英寸而不是厘米?这是因为发明计算机的老美使用的长度计量单位是英制的,据我所知好像就米国和英国继续用英制了吧,别的都换成公制了,其实也不难换,1英寸等于2.54厘米。横向分辨率为96DPI的显示器,在横向的2.54厘米里,就有96个像素,可以这么说,假如你有一张100*100像素的小图片,在96DPI的显示器上(为了方便起见,假设纵横DPI都一样)应该显示为2.65*2.65厘米,在128DPI的显示器上,应该显示为1.98*1.98厘米,图片看起来在高DPI显示器上显示得更小了。那么17寸和19寸的LCD显示器都是1280*1024的,17寸LCD的DPI是否高于19寸LCD的呢?理论上应该说是的,但我们的操作系统往往不管这些,都默认是96DPI,因为就算DPI有差距,通常也差别不大,就算差别大,用户难接受,还可以改变系统的显示分辨率来达到较好的显示效果呢,而除此之外,Windows还提供了调整字体DPI的选项来让字体显示大小适应用户习惯。

情况到了便携设备上就发生了些变化,因为便携设备的纵横像素数目分辨率不能调整,而且DPI可能差距很大。我的手机是Samsung SGH-i780的,方屏,分辨率为320*320,有次同事看了我的手机,说:“字怎么这么小的?”,他用的是240*320的,我就对比了一下我们的手机,屏幕宽度基本一致,高度我的就比他的短了一截,你想啊,垂直像素总数大家都是320点,而我的短了一截,所以看起来显示的文字就比较小了。还有更夸张一些的,现在新出的手机有480*800分辨率的,称作WVGA,横向480点,但实际物理尺寸跟我的320点的屏幕差不多,那上门的字恐怕就更小了,可能小到看不清了。而事实上呢?

事实上并没有这样,因为手机软件的作者已经考虑到这种事情了,所以在绘制文字的时候,会把文字弄大一点,这样文字的物理尺寸还是差不多的,而看起来却更加“细腻”。

横向DPI和纵向DPI可以这样获取:

GetDeviceCaps(hdc, LOGPIXELSX);
GetDeviceCaps(hdc, LOGPIXELSY);

对Windows Mobile来说,应该是这样的:
屏幕分辨率 DPI
240x320 96
480x640 192
240x240 96
480x480 192
480x800 192
320x320 128

你也许要问,为什么能够保证是这样?厂家能不能偷偷把屏幕做大一些,或者小一些?我想大概这是一种规范吧。生产Windows Mobile硬件的厂商也就那么几个,应该蛮好保证的。

那从我们开发者的角度来说,如何开发适用于各种DPI的程序呢?按照Microsoft的说法,可以这样:
You can continue to work in pixels but remove assumptions about the DPI by:
•Using the SCALEX and SCALEY macros to scale 96-DPI pixel coordinates, or using the metrics returned by GetSystemMetrics.
•Expressing sizes or positions relative to other controls.
•Expressing sizes or positions relative to a font.

更具体内容参考:
http://msdn.microsoft.com/en-us/library/bb416656.aspx

你可能感兴趣的:(屏幕分辨率)