Foxtable(狐表)用户栏目专家坐堂 → 操作系统什么地方看的到显示器的点距(或显示器实际大小)?


  共有10755人关注过本帖平板打印复制链接

主题:操作系统什么地方看的到显示器的点距(或显示器实际大小)?

帅哥哟,离线,有人找我吗?
Fotable
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1015 积分:6979 威望:0 精华:0 注册:2012/8/1 18:41:00
  发帖心情 Post By:2012/10/31 11:20:00 [只看该作者]

找了点相关资料给大家分享

最近要做一个所见即所得的图形编辑器,遇到了一个问题:如果以像素为单位在屏幕上画了一条直线后,那么如何知道它在屏幕上的物理长度?例如,假设我们在vc6中用向导新建一个简单的单文档程序PixerToInch,在它的ondraw函数中有如下代码:

[cpp:nogutter] view plaincopyprint?
  1. void CPixerToInchView::OnDraw(CDC* pDC)  
  2. {  
  3.     CPixerToInchDoc* pDoc = GetDocument();  
  4.     ASSERT_VALID(pDoc);  
  5.   
  6.     // TODO: add draw code for native data here   
  7.         //画一条96像素长的横线   
  8.     pDC->MoveTo(100,100);  
  9.     pDC->LineTo(196,100);  
  10.           
  11.         //画一条96像素长的竖线线   
  12.     pDC->MoveTo(100,100);  
  13.     pDC->LineTo(100,196);  
  14. }  

那么在我的aoc915sw显示器的屏幕上,实际测量的结果为水平线实际长度为接近31毫米,竖线的长度为大约为接近33毫米,为什么会出现这个结果呢?我查了很多资料,发现许多资料讲都是用dpi计算,但结果与我的实际不符,后经与网友七叶讨论,终于找到了正确的计算方式,现整理如下,以供后来者参考。

为了计算屏幕上的显示长度,需要知道如下几个参数

1、显示器的最大分辨率。显示器的最大分辨率可以去查该型号显示器的技术手册,例如对我的aocsw915显示器,其最大分辨率为1440*900。注意:要把显示器的最大分辨率和显卡的最大分辨率区别开来,在桌面上右键点"属性"->设置里看到的最大分辨率有可能是显卡的最大分辨率,比如我机器上的显卡型号为Intel 82945G Express Chipset ,它的最大分辨率是2048*1536。

      如果想直接查看显示器的最大分辨率,方法如下,在"属性"->"设置"里点"高级"->"监视器",选中"隐藏该显示器无法显示的模式",点确定后回到前面的对话框,此时看到的最大分辨率就是显示器的最大分辨率了。

2、windows系统的实际分辨率,即桌面上右键点"属性"->设置里的屏幕分辨率的值,我的是1280*768

3、显示器的点距,这个也需要查显示器的技术参数,aocsw915的点距为0.285mm

有了上面几个个参数之后,我们就可以计算出某个方向上的直线的实际长度了

公式为

屏幕长度(单位为毫米)=像素长度*最大分辩率*点距/当前分辨率 

例如对我的代码,屏幕上横线的长度为

96*0.285*1440/1280 = 30.78mm

竖线的屏幕长度为

96*0.285*900/768= 32.0625mm

和我的实际测量结果吻合。

小结:将像素长度乘当前的点距即可求出屏幕的实际长度,但是显示器标出的点距是在最大分辩率下的点距(此时也称显示器处于点对点模式)此时点距最小,当分辩率不是最大时,相当于把点距拉长了,此时的点距要考虑一个换算系数,即最大分辨率/当前分辨率,因此最后的公式为

像素数量*(最小点距*最大分辨率/实际分辩率)

[此贴子已经被作者于2012-10-31 11:20:04编辑过]

 回到顶部
总数 15 1 2 下一页