hur.cn - 华软网

 热门搜索

请教:如何计算显示器的物理尺寸

  作者:未知    来源:网络    更新时间:2009/9/2
我想编程计算出显示器的物理尺寸,而不是分辨率,我在网上看到有说下面的方法的,但是下面的方法计算出来的结果是随着分辨率的不同而不同的,所以还不对。请求高人指点。谢谢了。
HDC hScreenDC = ::GetDC(NULL); 
m_Width=::GetDeviceCaps(hScreenDC,HORZSIZE);
m_Highth=::GetDeviceCaps(hScreenDC,VERTSIZE);

---华软 网友回答---
直接查系统存储的显示器型号就可以了
---华软网友回复---
windows 程序设计 上册 124页。

中间有段话:

如果程序需要实际的视频显示大小该怎么办? 也许最好的办法是用对话框让用户输入他们。
---华软网友回复---
引用 2 楼 aoyihuashao 的回复:
windows 程序设计 上册 124页。

中间有段话:

如果程序需要实际的视频显示大小该怎么办? 也许最好的办法是用对话框让用户输入他们。


windows 程序设计 第五版。上册 124页。
---华软网友回复---
引用 2 楼 aoyihuashao 的回复:
windows 程序设计 上册 124页。

中间有段话:

如果程序需要实际的视频显示大小该怎么办? 也许最好的办法是用对话框让用户输入他们。

现在我想的是读取这个尺寸来,而不是让用户自己去输入,有办法吗?
---华软网友回复---
引用 1 楼 dirdirdir3 的回复:
直接查系统存储的显示器型号就可以了

您好,能不能说的详细点呢,能不能利用程序读取出来呢?
---华软网友回复---
引用 4 楼 twins222 的回复:
引用 2 楼 aoyihuashao 的回复:
windows 程序设计 上册 124页。

中间有段话:

如果程序需要实际的视频显示大小该怎么办? 也许最好的办法是用对话框让用户输入他们。

现在我想的是读取这个尺寸来,而不是让用户自己去输入,有办法吗?



意思就是不能,微软的大大们都说不能了,还能吗?
---华软网友回复---
引用 6 楼 aoyihuashao 的回复:
引用 4 楼 twins222 的回复:
引用 2 楼 aoyihuashao 的回复:
windows 程序设计 上册 124页。

中间有段话:

如果程序需要实际的视频显示大小该怎么办? 也许最好的办法是用对话框让用户输入他们。

现在我想的是读取这个尺寸来,而不是让用户自己去输入,有办法吗?



意思就是不能,微软的大大们都说不能了,还能吗?

哦 看来我白费功夫了
---华软网友回复---
引用 6 楼 aoyihuashao 的回复:
引用 4 楼 twins222 的回复:
引用 2 楼 aoyihuashao 的回复:
windows 程序设计 上册 124页。

中间有段话:

如果程序需要实际的视频显示大小该怎么办? 也许最好的办法是用对话框让用户输入他们。

现在我想的是读取这个尺寸来,而不是让用户自己去输入,有办法吗?



意思就是不能,微软的大大们都说不能了,还能吗?


或许你非要能的话,可以找显示器的生产商要API,但你又不可能固定用户用那个厂商的显示器,所以还是没办法。
---华软网友回复---
用GetDeviceCaps获取显示设备的DPI,比方说得到水平方向96DPI,用水平象元数除以这个DPI值就是水平方向英寸数。例如水平1920点,96DPI,计算结果就是20英寸。倾斜量可能就是一个24寸的显示器。

要注意的是这个数据对显示器不是很准确,大致凑合用吧。打印机的比较准,一般300~1440DIP各种不等。


---华软网友回复---
引用 9 楼 gordon3000 的回复:
用GetDeviceCaps获取显示设备的DPI,比方说得到水平方向96DPI,用水平象元数除以这个DPI值就是水平方向英寸数。例如水平1920点,96DPI,计算结果就是20英寸。倾斜量可能就是一个24寸的显示器。

要注意的是这个数据对显示器不是很准确,大致凑合用吧。打印机的比较准,一般300~1440DIP各种不等。

我用GetDeviceCaps读取的数据是320啊,我的水平像素是1280 除过以后就只有4了。DPI是什么呢?您能详细的说一下吗?
---华软网友回复---
貌似是无法得到显示器的具体物理尺寸的·~~
因为对于我们软件来讲,显示器的实际尺寸意义并不大·~
对于我们来说,有用的只是分辨率·~~

所以,我们得到的也是分辨率
---华软网友回复---
引用 10 楼 twins222 的回复:
引用 9 楼 gordon3000 的回复:
用GetDeviceCaps获取显示设备的DPI,比方说得到水平方向96DPI,用水平象元数除以这个DPI值就是水平方向英寸数。例如水平1920点,96DPI,计算结果就是20英寸。倾斜量可能就是一个24寸的显示器。

要注意的是这个数据对显示器不是很准确,大致凑合用吧。打印机的比较准,一般300~1440DIP各种不等。



我用GetDeviceCaps读取的数据是320啊,我的水平像素是1280 除过以后就只有4了。DPI是什么呢?您能详细的说一下吗?

DPI是Dot per inch,每英寸的点数,有72、96等,你怎么弄出320了?那是打印机的值。仔细找找,显示器不会那么高的。

---华软网友回复---
如果你是72,1280/72应该是17.8左右,你的应该是一个19寸的显示器。

这个不是很准,大概应该这样。

---华软网友回复---
引用 12 楼 gordon3000 的回复:
DPI是Dot per inch,每英寸的点数,有72、96等,你怎么弄出320了?那是打印机的值。仔细找找,显示器不会那么高的。

我修改了程序如下:
DpiW=::GetDeviceCaps(hScreenDC ,LOGPIXELSX);
DpiH=::GetDeviceCaps(hScreenDC ,LOGPIXELSY);
m_Width   =   GetSystemMetrics(   SM_CXSCREEN   );   
m_Highth  =   GetSystemMetrics(   SM_CYSCREEN   );   
m_Width=m_Width/DpiW;
m_Highth=m_Highth/DpiH;
m_DSize=sqrt(m_Width*m_Width+m_Highth*m_Highth);

现在DpiW和DpiH都是96,而m_Width是1280,m_Highth是1024,这样两个相除以后就是13,然后我又用勾股定理算出对角线的尺寸,是16.4英寸,我显示器是17#的,差不多。但是还是会出现修改了分辨率以后结果不一样的情况,我想问一下DPI能不能根据所设置的分辨率不同而进行改变啊,那样就能保证即使在一块屏上设置不同的分辨率也可以得到相同的尺寸了。谢谢回答。
---华软网友回复---
我想问一下DPI能不能根据所设置的分辨率不同而进行改变啊,那样就能保证即使在一块屏上设置不同的分辨率也可以得到相同的尺寸了。谢谢回答。
=============================================
我也没详细试过,好像设置分辨率以后这个DPI不会变的,只是在最佳分辨率附近有效。具体你自己试验吧。

---华软网友回复---
对于这个问题,还有没有人再给一个答复呢?
---华软网友回复---
我收回我的话了·~
是可以的。
看到一个软件就是这么做的·~~
参看鲁大师
---华软网友回复---
可以SetMapMode然后用取到的分辨率调用DPtoLP就能换算出来,比如说是MM_HIMETRIC模式,得到的就是0.01mm的精度,除以100就是mm了。
---华软网友回复---
引用 18 楼 wy2001wy 的回复:
可以SetMapMode然后用取到的分辨率调用DPtoLP就能换算出来,比如说是MM_HIMETRIC模式,得到的就是0.01mm的精度,除以100就是mm了。

您能再详细点说吗?我的程序如下:
DpiW=::GetDeviceCaps(hScreenDC ,LOGPIXELSX); 
DpiH=::GetDeviceCaps(hScreenDC ,LOGPIXELSY); 
m_Width  =  GetSystemMetrics(  SM_CXSCREEN  );  
m_Highth  =  GetSystemMetrics(  SM_CYSCREEN  );  
m_Width=m_Width/DpiW; 
m_Highth=m_Highth/DpiH; 
m_DSize=sqrt(m_Width*m_Width+m_Highth*m_Highth); 
现在DpiW和DpiH都是96,而m_Width是1280,m_Highth是1024,这样两个相除以后就是13,然后我又用勾股定理算出对角线的尺寸,是16.4英寸,我显示器是17#的,差不多。但是还是会出现修改了分辨率以后结果不一样的情况。

具体您说的那两个函数,我应该加到哪里呢?
---华软网友回复---
这个问题还没有解决。发现不是好解决的东西啊哎
---华软网友回复---
我这是另一种方法,下面是代码,得到的cx和cy的值就是显示器的大小,我算了一下确实是有误差的。 
CDC *pDC = GetDC(); 
CSize sz; 
sz.cx = GetSystemMetrics(SM_CXSCREEN); 
sz.cy = GetSystemMetrics(SM_CYSCREEN); 
pDC->SetMapMode(MM_HIMETRIC); 
pDC->DPtoLP(&sz); 

sz.cx /= 100; 
sz.cy /= 100; 
---华软网友回复---
引用 21 楼 wy2001wy 的回复:
我这是另一种方法,下面是代码,得到的cx和cy的值就是显示器的大小,我算了一下确实是有误差的。
CDC *pDC = GetDC();
CSize sz;
sz.cx = GetSystemMetrics(SM_CXSCREEN);
sz.cy = GetSystemMetrics(SM_CYSCREEN);
pDC->SetMapMode(MM_HIMETRIC);
pDC->DPtoLP(&sz);

sz.cx /= 100;
sz.cy /= 100;

您好,这个我也用了一下,现在是我的显示器是1280*1024的,在这个分辨率下,算出的结果是320,256.但是在其他分辨率下都是320,240,这个是怎么回事呢?
---华软网友回复---
不是,其他分辨率下也不都是320,240
---华软网友回复---
是的,我在不同分辨率下计算的结果也不同,这就是GDI的问题了。
---华软网友回复---
引用 24 楼 wy2001wy 的回复:
是的,我在不同分辨率下计算的结果也不同,这就是GDI的问题了。

那您说还没有什么其他方法去读取这个尺寸了吗?因为我搜索到了一些软件,他们就可以读取出来。
---华软网友回复---
偶是菜鸟,飘过学习。
---华软网友回复---
你这样得到的应该是显示器的显示物理尺寸,而不是物理尺寸,比如我一般喜欢通过手工调整在显示器两边各留5mm的边
---华软网友回复---
引用 27 楼 conry 的回复:
你这样得到的应该是显示器的显示物理尺寸,而不是物理尺寸,比如我一般喜欢通过手工调整在显示器两边各留5mm的边

哦那怎么得到物理尺寸呢?能不能得到呢?
---华软网友回复---
貌似不能。得到显示物理尺寸是可以的,显示器尺寸就不行了

LZ为什么有这个需求呢
---华软网友回复---
哦,有道理,那我就不会了,等待高手们解答吧。
---华软网友回复---
引用 29 楼 tr0j4n 的回复:
貌似不能。得到显示物理尺寸是可以的,显示器尺寸就不行了

LZ为什么有这个需求呢

是我们头让我做的,具体为什么我也不是很了解,这个问题似乎真的不能得出来,因为我找了几天了也没有看到任何地方有这个问题的答案。
---华软网友回复---
再继续问个问题,为什么用EVC工程读取触摸屏的尺寸的时候,下面函数读出来的数据竟然只有64和60,而触摸屏的尺寸应该是210和160左右啊
CString str1,str2,str3;
// HDC   hScreenDC=CreateDC(_T("DISPlAY"),   NULL,   NULL,   NULL);  
HDC hScreenDC = ::GetDC(NULL);
m_Width = GetDeviceCaps(hScreenDC,HORZSIZE);   //结果是64 m_Highth = GetDeviceCaps(hScreenDC,VERTSIZE);  //结果是60
m_DSize=sqrt(m_Width*m_Width+m_Highth*m_Highth)/25.4;  
str1.Format(_T("%d"),m_Width);
str2.Format(_T("%d"),m_Highth);
str3.Format(_T("%f"),m_DSize);
SetDlgItemText(IDC_EDIT1,str1);
SetDlgItemText(IDC_EDIT2,str2);
SetDlgItemText(IDC_EDIT3,str3);
---华软网友回复---
Mark..读分辨率是简单,要读物理的不太容易。
---华软网友回复---
引用 33 楼 alicehyxx 的回复:
Mark..读分辨率是简单,要读物理的不太容易。

那您知道怎么弄吗?
---华软网友回复---
  虽然我不知道如何去弄,但我知道一定能读出来。因为我看了优化大师能读出来显示器的物理尺寸。
---华软网友回复---
引用 35 楼 hnzlk 的回复:
  虽然我不知道如何去弄,但我知道一定能读出来。因为我看了优化大师能读出来显示器的物理尺寸。

我也看到优化大师能读出来了,但它是通过直接方式读出来的,还是间接方式读出来的,就不知道了,还有,如果能读出来的话,为什么我一直都没搜到呢,大家给出的解决方法我基本也都用过了,还是不行,总是跟分辨率有关系的。还有,现在我用EVC工程去读就会出现我在32楼说的那样,还是不知道原因,真的再等待高人
---华软网友回复---
国际惯例:自己顶
---华软网友回复---
LZ可以考虑读取显示器的EDID
可以从注册表里读  
  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\Default_Monitor\5&3a7255c5&0&11223344&01&00\Device  Parameters  
  如果你的系统可得显示器的EDID,就有EDID项,否则有BAD_EDID项
---华软网友回复---
EDID中有图像size 描述(2 bytes), 该2字节定义行、场最大size。注意单位为cm; 如最大行size 320mmà”20h”. 
就可以得出显示器的尺寸
具体请参考
http://hi.baidu.com/zebf/blog/item/2c8717d5ec3dacc151da4baf.html
---华软网友回复---
引用 38 楼 initialj 的回复:
LZ可以考虑读取显示器的EDID
可以从注册表里读  
  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\Default_Monitor\5&3a7255c5&0&11223344&01&00\Device  Parameters  
  如果你的系统可得显示器的EDID,就有EDI……



可行!      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。