GID映射模式MM_ISOTROPIC:SetMapMode();SetWindowOrgEx();SetViewportOrgEx();

把5.5读了近十几遍,朦胧理解GDI映射模式的概念记录一下这里.

映射:在GDI映射模式里我理解为:逻辑坐标与设备坐标的对应关系;

关系为:

xViewport=(xWindow-xWinOrg)*xViewExt/xWinExt+xViewOrg;

yViewport=(yWindow-yWinOrg)*yViewExt/xWinExt+yViewOrg;

这个关系对于理解很重要GID的映射模式前面几个都好理解,唯独自定义度量映射模式颇难.....

MM_ISOTROPIC映射模式;

使用WM_ISOTROPIC需要自己设置逻辑大小;和实际大小;

  SetWindowExtEx( HDC hdc, int nXExtent,nt nYExtent, LPSIZE lpSize);

设定逻辑范围;我们输出用的坐标都是逻辑坐标;我要输出、画都在这个逻辑范围内;

SetViewPortExtEx(hdc,int ,int ,NULL);

这个则是把实际的大小付给逻辑坐标;

这个时候我们逻辑单位;像前几种映射的逻辑单位一样:

xViewExt/xWinExt;

yViewExt/yWinExt;

这个时候基本的自定义的映射模式已经好了;逻辑坐标原点与设备坐标原点重合位于设备坐标的(0,0);不能仅仅这么简单就结束;

SetViewportorgEx(hdc,int ,int ,NULL);

设置设备坐标原点;

SetWindowOrgEx(hdc,0,0;NULL);

设置映射逻辑点;

这个两个函数单独用太easy没意思;看下面;

SetViewPortOrgEx(hdc,cxClient/2,cyClient,NULL);

SetWindoworgEx(hdc, nXExtent/2, nYExtent/2,NULL);

好戏开始;

这个时候设备坐标原点被设置在客户区的中心点;

这个时候逻辑坐标系统的(nxExtent/2,nYExtent)被映射到设备坐标原点; 设备坐标原点又被设置到(cxClient/2,cyClient/2),你猜现在逻辑坐标的原点在哪?

Res:设备坐标原点此时在将((0-nXExtent/2)*xViewExtX/xWinext+xVieworg,(0-nYExten/2)*xViewExt/xWinExt+yVieworg);

其实也就是设备原点减去逻辑单位对应的各设备单位;

然后这么麻烦有什么用处 ?

这个主要保证了输出的东西永远在逻辑范围内,而又保证了逻辑单位在客户区内;无论缩放各种拉啊拉;逻辑坐标被映射到设备坐标的特定位置;

BOOL OffsetWindowOrgEx(HDC hdc, int nXOffset, int nYOffset, LPPOINT lpPoint);

nXOffset:指定以逻辑单位为单位的水平位移。移动方向取决于当前设置的窗口坐标方向,如果为正表示向窗口水平轴坐标的正方向移动,如果为负表示向窗口水平轴坐标的负方向移动。

自定义映射模式x,y的增值方向是可以改变的;

SetWindowExtEx();SetVeiwportExtEx();举个例子;这两个函数的指定y轴范围时;正的时候就是y向下递增;负的时候指定y向上递增;主要象限的问题

在windows程序设计时钟里面的四象限笛卡尔坐标系统就加上一个Y轴向下递增的逻辑坐标系统;

一般把逻辑坐标系统坐标的中心映射到设备坐标的中心这样我就可以围绕不用的窗口类型完成围绕中心的操作.

贴贴代码


没有移动的逻辑坐标系统的原点永远和设备坐标的原点有对应关系;这就是映射;这些我们就可以用逻辑坐标来做输出、画图;咋切不用考虑窗口的WM_SIZE消息所带来的不必要的麻烦吧吧吧...

同比例缩放放大;各向同性;isotropic;MM_ISOTROPIC;

Windows程序设计第八章数字时钟.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值