关于使用CDC画图的问题:
我设置用0.1mm作为单位
void CCircleView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)  
{
pDC->SetMapMode( MM_LOMETRIC );
CView::OnPrepareDC(pDC, pInfo);
}

画一个7cm直径的正圆

void CCircleView::OnDraw(CDC* pDC)
{
CCircleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

pDC->Ellipse( 0,0,700,-700 );
}
但实际画出来的不是7cm,却是5.1cm,为什么会这样?

答:

首先介绍下用GetDeviceCaps函数得到的信息:

HORZSIZE = 25.4*HORZRES/72

HORZRES为水平方向的像素总数

LOGPIXELSX  逻辑像素(小字体为96,大字体为120)

屏幕为15.4寸的,长为33.2cm,宽为20.7cm

注意GDI函数中的700只是一个逻辑单位,如果要得到实际的尺寸还得转化成像素再转化实际的长度。

70mm(逻辑)------   70*(72/25.4=1280/452表示1mm有多少个像素)*(332/1280表示每个像素的实际宽度)

70mm(逻辑)=70*1280/452*332/1280=70*332/452=51.41(实际)

因为任何逻辑单位假定的分辨率为72DPI,所以HORZSIZE VERTSIZE只在这个假定的分辨率下得到逻辑长度而不是实际长度。

1366 768 - - - 482 271          1366/72*25.4 = 481.8944444444444

800 600  ---282 212       800/72*25.4=282.2222222      其他也可以通过同样的公式得到

1024 768  --- 361 271

1280 720 ----452 254

1280 800 ---452 282

而LOGPIXELSX和LOGPIXELXY这两个量是系统为显示字体而搞的鬼,比如10磅(或者说成10点)的字体,由于1磅为1/72英寸,所以系统的DPI为96的话,则一个字应该占10/72*96=13个像素,而如果这个值为120的话,则一个字应该占10/72*120=16个像素。所以这两个量跟本问题无关。

所以70mm是假定分辨率为72DPI下的逻辑长度,任何逻辑坐标都要转成设备坐标即像素(为了显示)。72DPI表示1英寸有72个点(像素)。那么逻辑长度1mm有多少个点(像素)呢?1英寸有72个点,1英寸又有25.4mm,所以1mm就应该有72/25.4个点,即70mm就应该有70*(72/25.4)个像素。

我们知道HORZSIZE=25.4*HORZRES/72,所以72/25.4=HORZRES/HORSIZE(即水平方向上的像素总数/水平方向上在假定分辨率为72DPI下的逻辑总长度)=1280/452

而我们的屏幕是33.2cm宽,像素为1280个,所以每个像素的实际长度应为332/1280mm

所以70mm的逻辑长度转成实际的物理长度就应该为70*(72/25.4)*33.2/1280=70*(1280/452)*332/1280=70*332/452=51.41mm的实际物理长度。

所以要想画出真实的物理长度得进行一翻转换。

我们注意在70mm(逻辑长度)在转化的时候只用到了332和452这两个数字,即屏幕的物理长度和水平方向像素总量为1280时在假定分辨率72DPI下的逻辑总长度(即HORZSIZE的值,这个值会随分辨率不同而不同,但不会随LOGPIXELSX而变化),所以在编程序时得考虑这两个量,HORZSIZE可以通过GetDeviceCaps轻松获取,而屏幕的物理长度怎么获取呢?这个问题我也不知道,我是自己用直尺量的(过后在网上查了下电脑的屏幕是15.4寸的)所以这样的程序没有可移植性,正如Charles Petzold说的那样(如果程序需要实际的视频显示大小的该怎么办?也话最好的解决方法是用对话框让用户输入它们)

哎,真蛋疼,那就搞个对话框让他输吧?coding....

void CCircleDlg::OnButton1() 
{
 // TODO: Add your control notification handler code here
 UpdateData(TRUE);
 CDC *pDC=GetDC();
 pDC->SetMapMode( MM_LOMETRIC );
 int Horzsize=pDC->GetDeviceCaps(HORZSIZE);
 int Vertsize=pDC->GetDeviceCaps(VERTSIZE);
 if(m_Width!=0 && m_Height!=0)
  pDC->Ellipse(0,0,10*m_Radius*Horzsize/m_Width,0-10*m_Radius*Vertsize/m_Height);//由于是UINT类型注意第4个参数的写法,否则当无符号数处理

}

量一量,呵呵,果然是7cm,啊哈哈!~~~

最后说明下,我的显示分辨率为1280*800,屏幕为15.4寸,332mm*207mm

希望大家读了这篇文章能对图形基础知识有所了解,Charles Petzold第5章讲得真是一塌糊涂,看了一下午不知道他要说啥,哎,高手就是高手没办法。你们若有问题请留言。。。

如何在程序中画出实际大小为7CM半径的圆相关推荐

  1. python如何画3个相切的圆_如何在几何画板中画出三个两两相切的圆

    <圆和圆的位置关系>是人教版九年级数学必学内容,在学习圆与圆的位置关系时,我们都知道圆与圆的位置关系有:相离,外切,相交,内切,内含,它们之间的位置是由圆心距与两半径的长度来确定的.那么如 ...

  2. 学术大咖教你一个轻松在论文中画出漂亮插图的方法

    在撰写论文的过程中,一张精美的论文配图是你的加分项.俗话说:"好马配好鞍",一张规范的高质量配图也是发表高水平论文的必备条件,使用得当的话一定能让你的论文如虎添翼.当我们仔细分析那 ...

  3. android程序大牛,冲向大牛之安卓:学习界面怎么在程序中画出来

    今天看了一个内存管理软件,界面全是在程序中画出来的,了解后才发现原来这种内存管理软件因为界面时常在变化 所以只能在程序中通过代码来实现,这就要设计到安卓中的view类了,直接上代码: import a ...

  4. 如何在科研论文中画出漂亮的插图?(附代码)

    来源:机器学习实验室 本文约3300字,建议阅读5分钟. 本文给大家推荐几种在论文中画出漂亮的插图的方法. 方法一 强烈推荐 Python 的绘图模块 matplotlib: python plott ...

  5. matlab提取数据画图,matlab提取excel表格数据画图-如何将Excel中的数据导入MATLAB并在MATLAB中画出图......

    在matlab上如何导入excel表格然后画图 工具:matlab 2018b 1.打开matlab,点击主页下面导入数据,可以导入excel数据,在此将自己命名的huitushuju文件导入: 2. ...

  6. matlab学位论文绘图美化工具_推荐几个超级好用的工具,让你在论文中画出漂亮的插图...

    每次我们看到优秀期刊中的文章,比如<Nature>.<Cell>,我们都会被文章中的插图惊艳到.再瞅瞅我们自己论文中的插图,总觉得比别人low了好几个c层次.一个好看的插图绝对 ...

  7. MATLAB画论文里的图片,如何在论文中画出漂亮的插图?

    经常看到别人论文中画出各种绚烂的插图,是用什么软件画出来的呢?分享一下我的绘画思路和常用软件. 绘画思路 ● 论文插图终归是内容导向,数据少/逻辑简单很难画出炫酷的图. ● 专业图尽量用对应的专业软件 ...

  8. R语言可视化包ggplot2在一张图中画出两条线实战

    R语言可视化包ggplot2在一张图中画出两条线实战 目录 R语言可视化包ggplot2在一张图中画出两条线实战

  9. python画三维立体图-如何在论文中画出漂亮的插图?

    ----2020.08.07增---- 看到评论区有人说"没代码没教程所以没帮助"-- 好吧,我寻思链接.参考资料都在回答中给出来了呀(可能不够明显?) 于是,重新整理.注释了一下 ...

最新文章

  1. 【C 语言】结构体 ( 结构体变量内存操作 | 通过 “ . “ 操作符操作结构体内存空间 | 通过 “ -> “ 操作符操作结构体内存空间 )
  2. Handler消息传递机制(二)Handler,Loop,Message,MessageQueue的工作原理
  3. python安装mysqlclient模块报fatal error: Python.h:解决方法
  4. 【转】走进windows编程的世界-----对话框、文本框、按钮
  5. linux在A目录下创建B文件,Linux课程---5、常用文件命令和目录命令(创建文件命令)...
  6. 个性化联邦学习算法框架发布,赋能AI药物研发
  7. 用Python爬了IPhone全部游戏免费榜的实时排名,我发现~
  8. 功能测试-测试定义与原则
  9. DXUT框架剖析(1)
  10. Unity3D之UGUI基础4:Button按钮
  11. 超混沌Lorenz系统图像加密(MATLAB)
  12. 服务器 raid配置
  13. OpenCV官方教程中文版
  14. CSDN App产品分析报告
  15. 【数组】#66 加一
  16. APOllO服务器性能,HPE Apollo 4200 Gen9 服务器
  17. java 如何计算时间段_Java程序来计算两个时间段之间的时差
  18. 淘宝员工感慨阿里没竞争力:百度24K,阿里30K,毫不犹豫选百度
  19. 安全度过试用期的四大“防身术”,了解防吃亏!
  20. mysql select 1 from dual_pl-sql中select * from dual 这个dual是什么

热门文章

  1. HALCON 21.11:深度学习笔记---术语表(7)
  2. aver函数C语言怎么用,C语言函数使用
  3. php语法基础考试,我的php学习第二十六天——PHP基础语法
  4. laravel中的ORM模型修改created_at,updated_at,deleted_at三个时间字段类型
  5. 20个开发人员非常有用的Java功能代码(二)
  6. 关于laravel数据库问题
  7. JavaScript PHP 通过URLEncode字串判断其编码是UTF-8还是GBK
  8. 医疗信息化 医学信息 医院管理 资料下载
  9. js跨域的理解与实现
  10. 华为机试HJ105:记负均正II