(转)MFC中SetWorldTransform函数中XFORM结构体的使用

SetGraphicsMode

  函数功能:该函数为指定的设备环境设置图形模式。
  函数原型:int SetGraphicsMode(HDC hdc, int iMode);
  参数:
  hdc:指向设备环境的句柄。
  iMode:指定图形模式,该参数可为下列值之一:
  GM_COMPAIBLE:设置与16位Windows相兼容的图形模式,这是缺省的模式。如果指定此值,应用程序只能通过调用设置窗口视窗范围和原点的函数来改变全局到设备的转换,但不是通过利用SetWorldTransform或ModifyWorldTransform,调用这些函数将失败,设置窗口和视窗范围和原点的函数的例子为SetViewportExtEx和SetwindowExtEx函数。
  GM_ADVANCED:Windows NT和Windows 98:设置高级图形模式,允许全局转换。如果应用程序设置或改变指定设备环境的全局转换,必须规定该值在这种模式中,所有的图形,包括文本输出,全部转换为设备环境规定的全局到设备的转换。
  Windows 95:不支持GM_ADVANCED,当操作增强的元文件时,Windows 95试图使Windows95中的增强的元文件看起来与在Windows NT上操作一样。为完成此功能,Windows 95当操作指定的增强元文件记录时,可以模仿GM_ADVANCED模式。
  返回值:如果调用成功,返回值为老图形模式,调用失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
  备注:根据图形模式,有3种不同的表格输出:
  TextOutput:在GM_COMPATIBLE模式中,TrueType(或矢量字体)文本输出时的操作方式就该DC中全局到设备转换而言很象光栅字体文本输出。TrueType文本总是按从左到右和从上到下的顺序写,即使图形的剩余部分在X或Y轴被翻动,只有TrueType(或矢量字体)文本的高被定为合适的高度,在GM_COMPATIBLE模式中写非水平文本的唯一办法,是为该设备环境中选举的字体指定非零表格的大小和方向。
  在GM_ADVANCED模式中TrueType(或矢量字体)文本输出完全转换为设备环境中域到设备的转换,光栅字体只有很受局限的转换能力(通过某些整型系数来伸展)。图形设备界面(GDI)试图创造出最好的输出。
  Rectangle Exclusion:如果设置缺省的GM_COMPATIBLE图形模式,当画长方形时,系统不包括底部和最右的边。GM_ADVANCED图形模式应用于画底边和右边包括在内的长方形。
  Arc Drawing:如果设置缺省的GM_COMPATIBLE图形为模式,GDI用设备空间中当前弧的方向来画弧,根据此协议,弧不管页面到设备的转换,此转换要求沿着X或Y轴的翻动。如果设置了GM_ADVANCED图形模式,GDI总是在逻辑空间逆时针方向画弧。这就是说在GM_COMPATIBLE图形模式中,弧控制点和弧本身,都全遵从设备环境的全局到设备的转换。

SetWorldTransform

  函数功能:该函数为指定的设备环境设置全局空间和页面空间之间的二维的线性转变,此转换可用于比例缩放、旋转、剪切或翻译图形的输出。
  函数原型:BOOL SetWorldTransform(HDC hdc, CONST XFORM *lpXform);
  hdc:指向设备环境的句柄。
  lpxform:指向XFORM结构的指针,此结构含有转换数据。
  返回值:如果函数调用成功,返回值为非零值,否则为零。
  Windows NT:若想获得更多错误信息,请调用GetLastError函数。
  备注:对任何全局空间中的坐标点(X、Y),页面空间中的转换坐标点(X、Y)以下式来决定。
  X'=X*eM11+y*eM21+eDx, Y'+X*eM12+y*eM22+eDy
  转换矩阵为下列矩阵:
  |eM11 eM120|
  |eM21 eM220|
  |eDx eDy | 映射方式(由当前窗口和视口原点定义的)用于定义单位和比例。全局转换常用于以不依靠设备的方式来缩放或旋转逻辑图像。缺省全局转换是偏移为零的等同矩阵。除非先调用SetGraphicsMode函数将给定设备环境的图形模式设置为GM_ADVANCED,否则SetworldTranform函数调用将失败,同样,也不可能重新把设备环境的图形方式设置成缺省的GM_COMPATIBLE方式,除非全局转已经通过调用SetWorldtransform或ModifyworldTransform函数首先重新设置缺省的等同转换。
使用XFORM来控制DC时,需要先设置绘图模式SetGraphicsMode为GM_ADVANCED,再用SetWorldTransform。
否则SetWorldTransform函数会失败
映射后的坐标与映射前的坐标关系为
x' = x * eM11 + y * eM21 + eDx, 
y' = x * eM12 + y * eM22 + eDy, 

若要设置缩放比例,则只需设置eM11和eM22为相应的比例,其余设置为0即可;
若要设置一个逆时针旋转了@度的坐标系映射,则eM11为cos(@), eM12为-sin(@), eM21 为 sin(@), eM22为cos(@)
若要使坐标系平移(a,b),则eDx=a, eDy = b。

若要设置一个缩放比例为0.5,逆时针旋转30度,平移(20,50)的坐标系,则eM11 = 0.5 * cos(30) = 0.4330, eM12 = 0.5 * [- sin( 30 )] = -0.25, eM21 = 0.5 * sin ( 30 ) = 0.25, eM22 = 0.5 * cos( 30 ) = 0.4330, eDx = 20, eDy = 50

注:以上关系只在不改变和原屏幕坐标一样的XY轴关系(X轴正方向为Y轴正方向逆时针旋转90度)的情况下成立。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值