【转载】http://blog.sina.com.cn/s/blog_638dd78201018663.html

函数原型:int GetDeviceCaps(int nIndex);

常用的参数有(参考MSDN):

int iHORZSIZE=pDC->GetDeviceCaps(HORZSIZE); // 得到当前显示设备的水平大小(毫米)

int iVERTSIZE=pDC->GetDeviceCaps(VERTSIZE);// 得到当前显示设备的垂直大小(毫米)

int iHORZRES=pDC->GetDeviceCaps(HORZRES);// 得到当前显示设备的水平像素数

int iVERTRES=pDC->GetDeviceCaps(VERTRES);// 得到当前显示设备的垂直像素数

int iLOGPIXELSX=pDC->GetDeviceCaps(LOGPIXELSX);// 得到当前显示设备的水平单位英寸像素数

int iLOGPIXELSY=pDC->GetDeviceCaps(LOGPIXELSY);// 得到当前显示设备的垂直单位英寸像素数

int iPHYSICALWIDTH=pDC->GetDeviceCaps(PHYSICALWIDTH);// 得到当前打印设备的水平大小(毫米)

int iPHYSICALHEIGHT=pDC->GetDeviceCaps(PHYSICALHEIGHT);// 得到当前打印设备的水平大小(毫米)

验证结果:

1.对于打印设备来说完全正确,可以利用上述参数在打印时得到与实际尺寸一致的结果。

2.对于打印设备来说上面的三组参数存在运算关系

iHORZSIZE=iHORZRES*25.4/iLOGPIXELSX;

iVERTSIZE=iVERTRES*25.4/iLOGPIXELSY;

3.对于显示设备来说,LOGPIXELSX和LOGPIXELSY得到的结果和Windows设置的字体有关,100%时为96dpi,150%时为144dpi。

4.至少对我目前的笔记本显示器来说,上述函数调用得到结果只有iHORZRES和iVERTRES是准确的,LOGPIXELSX和LOGPIXELSY为96(我设置的是正常字体),而iHORZSIZE和iVERTSIZE似乎是用72dpi计算出来的:

iHORZSIZE=iHORZRES*25.4/72;

iVERTSIZE=iVERTRES*25.4/72;

不知这个72dpi从何而来

5.对我的笔记本显示器,经验证,改变分辨率和windows字体大小时,3和4的结论都正确,72dpi不变

6.PHYSICALWIDTH和PHYSICALHEIGHT这组参数,只对打印设备有效,得到是当前打印机纸张的全部像素数,而iHORZRES和iVERTRES得到的都是可打印范围的像素数,对显示设备这组参数返回值为0

7.Google结果显示可用读注册表中显示器的EDID信息得到显示器的物理尺寸,比较复杂,研究中

VC GDI 像素转厘米(英寸)[转发]的更多相关文章

  1. 【转载】VC GDI 像素转厘米(英寸)

    [转载]http://blog.sina.com.cn/s/blog_638dd78201018663.html 函数原型:int GetDeviceCaps(int nIndex); 常用的参数有( ...

  2. GDI 像素(5)

    RGB 颜色 使用 RGB 宏可以创建一个由三个整数值(R.G.B)的 COLORREF 值. COLORREF RGB( BYTE byRed, // 红色值(R) BYTE byGreen, // ...

  3. VC GDI+基础用法VC

    #include "GdiPlus.h" // 使用GDI+ 命名空间 using namespace Gdiplus; // 与GDI+ 相关的其它头文件,如:GraphicsP ...

  4. VC++ GDI 总结 一一 CBitmap类

    class CBitmap : public CGdiObject { DECLARE_DYNAMIC(CBitmap) public: static CBitmap* PASCAL FromHand ...

  5. VC GDI双缓冲机制绘图防屏幕闪烁实现步骤

    在OnDraw(CDC* pDC) 中添加如下代码 CDC MemDC; //首先定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设 ...

  6. Zara带你快速入门WPF(2)---布局篇

    一.章节目标 这几章节我们会创建一个完整的Window程序,包括使用DataGrid空间,数据绑定是把.NET类中的数据提供给用户界面的一个重要概念,还允许修改数据,包括.NET4.5新增的INoti ...

  7. 学习GDI+ (1)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. GDI编程基础

    窗口和视口 视口是基于设备的采用的是设备坐标(单位:像素),窗口是基于程序的采用的是逻辑坐标(单位:像素/毫米/厘米等). 在默认的映射模式下,视口是与窗口等同的.但是如果改变其映射模式,则其对应的单 ...

  9. 对屏幕的理解---分辨率,dpi,ppi,屏幕尺寸,像素 等

    1. 名词理解 屏幕尺寸(screen size) 屏幕尺寸(screen size),是屏幕的对角线长度,一般讲的大小单位都是英寸. DPI (dots per inch) dpi 是(英文Dots ...

随机推荐

  1. 书上关于*(p++)表达式的几种变形形式的思考题

    代码: int main(){ int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; int *p = &a[3]; cout << "*p++ = ...

  2. Havel-Hakimi定理的方法来构图

    给定一组非负数字,(数字为节点的度),判断该组数字能不能构成图. Havel-Hakimi定理: 将序列按照从大到小排序之后,从第二个数开始到第一个数的长度+1为止,依次减1.每操作一次,删掉第一个数 ...

  3. 客户端无法加入域,报错:“无法与域‘xxx.com’的Active Directory域控制器(AD DC)链接” 请确保键入的域名正确

    1.客户端能不能解析到域名? nslookup 一下域名看看解析到的IP的地址 2.客户端的DNS要指向DC 3.客户端的相关服务,workstation,TCP/IP NetBios Helper, ...

  4. javascript的数组之slice()

    slice()方法创建一个新数组,将原数组的部分元素拷贝到新数组,并将新数组返回,且原数组不会被修改. var animals = ['ant', 'bison', 'camel', 'duck', ...

  5. llinux挂载多个光驱

    因为u盘量产,一个u盘两启,所以linux需要访问多个cdrom(一个物理光驱,一个虚拟光驱),本来一位无法使用,看了看/dev目录下面, [root@linux-node3 cdrom]$ ll / ...

  6. day01 python入门之路

    Python之路,Day1 - Python基础1   本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼 ...

  7. 【Python基础】lpthw - Exercise 39 字典

    1. 字典和列表的区别 对于列表,它是一些项的有序排列,只能通过数值来进行索引:对于字典,则可以通过许多东西进行索引,它采用键-值映射的方式,不存在一个特定的顺序,因此不能用类似列表的数值索引,但它的 ...

  8. C#中$的用法

    class Program { static void Main(string[] args) { string tbName = "User"; string colName = ...

  9. 记一次mariadb升级故障

    由于做mariadb集群,将版本从自带的5.5升级到10.0.3,升级成功后发现起不来 查journal log,只有一行warning can’t create test file /var/lib ...

  10. Win10问题汇总

    1.重置网络连接命令 netsh winsock reset ipconfig /flushdns 2.WIN10去除我的电脑上面的6个文件夹 把下面代码复制,保存到.reg中,然后执行即可(修改注册 ...