高分求解,关于GDI映射模式的问题,高手进,在线等!

zswzwy 2005-11-17 03:39:39
初次接触映射模式,搞得一头雾水,请大侠们指定一二。

以下是我的理解:
CDC::SetMapMode(MM_LOMETRIC); 设置每像素对应0.01厘米,如果要画一个2*2厘米的方框可以这样调用:pDC->Rectangle(100, -100, 300, -300);

请问:
1、CDC::SetMapMode(MM_ANISOTROPIC)设置每像素对应多少厘米?画一个2*2厘米的方框怎么办?
2、pDC->SetWindowExt(100, 100); 和 pDC->SetWindowExt(10, 10); 作用是什么?区别在哪?
3、pDC->SetViewportExt(100, 100); 和 pDC->SetViewportExt(10, 10);作用是什么?区别在哪?

问题解决再开贴加分!
问题解决再开贴加分!
问题解决再开贴加分!
问题解决再开贴加分!
问题解决再开贴加分!
...全文
1230 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
liufang8318 2010-06-02
  • 打赏
  • 举报
回复
贴子是不错,看了也是一头雾水啊!
lineuser 2006-06-30
  • 打赏
  • 举报
回复
好贴,先收藏再好好看看
mylzw 2006-02-26
  • 打赏
  • 举报
回复
老大们,这东西讨论讨论就行了! 千万别用在项目中啊。
因为Win32API有些是基于逻辑坐标的,有些是基于设备坐标的。
本来用这套机制就是想让系统实现自动的转换,但结果。。。!!!
结果搞的有时候系统会帮你转,有时候还要你自己动手~ 郁闷死人不偿命啊。

还是自己写转换代码来得更加“可预测”些~
broccoli 2006-01-06
  • 打赏
  • 举报
回复
mark
dlscdn 2005-11-23
  • 打赏
  • 举报
回复
mark
寻开心 2005-11-18
  • 打赏
  • 举报
回复
tmd,打广告的真该枪毙
寻开心 2005-11-18
  • 打赏
  • 举报
回复
如果是输出到打印机,打印机的分辨率600DPI
那么nW和nH都是600了

msdn上面的那个例子当中, windowExt范围是600,600
这样恰好就可以保证了
1个逻辑单位,对应一个打印机上的象素了

我估计你没有理解那篇文章当中最关键的一句话,关于viewportExt的单位的
理解了它你就清楚了:
Values are always in absolute units (not logical units) and are not affected by the current mapping mode.
数值是绝对单位(不是逻辑单位),不受到映射模式的影响

所谓的绝对单位是什么? 就是设备的分辨率所对应的单位啊

寻开心 2005-11-18
  • 打赏
  • 举报
回复
你看一下在输出到显示器的情况下
设置给viewport的
nW和nH都是96,它表示的是:屏幕上 1 inch=96象素
对应的逻辑坐标系下 2540个单位

转换成位1cm,就是
显示器上的 2.54厘米, 对应逻辑坐标系下的2540单位
所以是: 1000个逻辑坐标系单位等于屏幕上的1cm
寻开心 2005-11-18
  • 打赏
  • 举报
回复
反了呀 是 1 inch = 2.54 cm
所以:
inch * 2.54 = cm
inch = cm/2.54

逻辑坐标系下的1000 = 设备坐标系(显示器)上的1cm
你可以自己找把尺子,量

要想100等于1cm
windowext的范围就是254,254了
zswzwy 2005-11-18
  • 打赏
  • 举报
回复
inch / 2.54 = cm;
inch = cm * 2.54;

1 : 254;

100就等于1cm。

是这样吧,happy__888兄。
寻开心 2005-11-18
  • 打赏
  • 举报
回复
这个时候的设置是和窗口的大小无关的

如果想和窗口大小相关,比如逻辑坐标下的1000,1000对应恰好窗口的宽度,这样:

CRect rect;
pDC->GetWindow()->GetClientRect(&rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowOrg(0, 0);
pDC->SetWindowExt(1000, 1000); // logical window is 600 dpi
pDC->SetViewportOrg(0, 0);
pDC->SetViewportExt(rect.Width(),rect.Height() );

pDC->TextOut(0, 0, "Test");
pDC->MoveTo(100, 100);
pDC->LineTo(900, 900); // 从屏幕的左上角一直到右下角,两端各自保留1/10
窗口大小变化的时候,线的位置也会自动跟随变化
寻开心 2005-11-18
  • 打赏
  • 举报
回复
窗口的宽度和高度是一个比例数值, 设置成为300:200, 和设置成为3:2是一样的
同样的视口之间的宽度和高度也是一个比例数值,设置成5:4和50:40也是一样的

窗口宽度/高度 和 视口宽度/高度 之间的比例关系是有影响

因此,在厘米和英寸的变化当中,
你把viewport的宽和高度除以2.54等同于把window的宽度和高度乘以2.54
显然,用乘法的效果更好

上面给的例子当中就是:
窗口当中 2540单位宽度等同于设备当中的LOGPIXELSX, 也就是每英寸的象素数目
这样就等同于 1000个窗口单位,等同于设备的1个厘米的宽度了
寻开心 2005-11-18
  • 打赏
  • 举报
回复
给你一个例子
下面的设置下,保证的是1000个逻辑单位,对应于显示设备的1cm
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowOrg(0, 0);
pDC->SetWindowExt(2540, 2540);
pDC->SetViewportOrg(0, 0);
// 显示器每英寸多少象素
int nW = pDC->GetDeviceCaps(LOGPIXELSX);
int nH = pDC->GetDeviceCaps(LOGPIXELSY);
pDC->SetViewportExt(nW, nH);

pDC->TextOut(0, 0, "Test");
pDC->MoveTo(0, 0);
pDC->LineTo(1000, 1000);
Kudeet 2005-11-18
  • 打赏
  • 举报
回复
根据你上面的代码:
一个像素的逻辑坐标数为:fx*50/rect.right()
50厘米的实际长度对应的像素数为:50*fx
所以如果要画始终大小为50厘米的图应该为50*fx*fx*50/rect.right()

bobob 2005-11-18
  • 打赏
  • 举报
回复
就是因为我知道楼上要这么说,所以我才置盯:)
teli_eurydice 2005-11-18
  • 打赏
  • 举报
回复
up,现在忙啊,一会来看
zswzwy 2005-11-18
  • 打赏
  • 举报
回复
即将结贴,感谢各位!

感谢 happy__888兄跟帖支持。
zswzwy 2005-11-18
  • 打赏
  • 举报
回复
反了呀 是 1 inch = 2.54 cm
所以:
inch * 2.54 = cm
inch = cm/2.54


??????????????????我反了?????
快乐鹦鹉 2005-11-18
  • 打赏
  • 举报
回复
mark一下
CDC::SetMapMode(MM_LOMETRIC); 设置每像素对应0.01厘米
有语病,像素就是像素,怎么能说每像素对应0.01厘米呢。不存在这种对应关系。设置这种模式后,如果调用pDC->Rectangle(100, -100, 300, -300); 那么这里的100代表100个0.01厘米长度,而不是100个像素。像素和厘米都是长度单位。
打雷啦的专栏 2005-11-17
  • 打赏
  • 举报
回复
看了各位红星级别的讨论,我也明白了,本来看这一章的时候也是一头雾水.
加载更多回复(27)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧