GDI 和GDI+ 混合编程

主要来源于这篇文章

http://www.cnblogs.com/jcily/archive/2009/05/30/1492222.html?login=1#commentform

 

在Win32平台下图形绘制相关开发中,都会使用MM_HIMETRIC映射模式,因为这样的逻辑绘制坐标精度比MM_TEXT要高很多。偶尔我也会使用GDI+的来绘制一些反走样线条或GDI不能达到的效果。

遇到的问题:

      1,使用MM_HIMETRIC映射模式的DC进行GDI+绘文字,其效果是文字是倒的。

      2,同上映射模式下,对于同位置的图形,分别使用GDI和GDI+绘制,显示效果上会有一些偏移(相对的输出误差)。

至于问题的原因,我没办法得知,我看不到GDI+的实现。

解决方法:

      1,MM_HIMETRIC映射模式下文字倒的问题解决代码如下:

     //  对绘制矩阵进行临时的变换来解决
    Graphics m_pGp(hDC);
    Matrix matrixOld, matrixNow;
    m_pGp
-> GetTransform( & matrixOld);    m_pGp -> GetTransform( & matrixNow);
    PointF gpPoint(
500 , - 500 );     //  MM_HIMETRIC下文字的逻辑坐标位置
    
//  变换绘制矩阵
    matrixNow.Translate(gpPoint.X, gpPoint.Y);
    matrixNow.Scale(
1 , - 1 );
    matrixNow.Rotate(lf.lfEscapement
/ 10 );
    matrixNow.Translate(
- gpPoint.X,  - gpPoint.Y);
    m_pGp
-> SetTransform( & matrixNow);

 

    FontFamily  fontFamily(L

" 宋体 " );
    Font        font(
& fontFamily,  600 , FontStyleRegular, UnitPixel);
    SolidBrush  solidBrush(Color(
255 , 255 , 0 , 0 ));
    Status sresult 
=  m_pGp -> DrawString(_T(文字还倒不倒),  - 1 & font, gpPoint,  & solidBrush);
    
//  恢复全局矩阵
    m_pGp -> SetTransform( & matrixOld);

 

 

      2,MM_HIMETRIC映射模式下GDI+与GDI图形输出误差解决代码如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
    Graphics g(pDC->GetSafeHandle());
    g.SetSmoothingMode(SmoothingModeHighQuality);
    
// 偏移修正MM_HIMETRIC映射模式下GDI与GDI+之间DP到LP的转换值的误差
    
// 得到同一个设备点分别由GDI+和GDI转化的逻辑点
    Point gpPt0(0,0);
    g.TransformPoints(CoordinateSpaceWorld, CoordinateSpaceDevice, 
&gpPt0, 1);
    CPoint pt(
0,0);
    pDC
->DPtoLP(pt.x, pt.y);
    
// 相减得到误差
    Point szTrans(gpPt0.X-pt.x, gpPt0.Y-pt.y);
    g.TranslateTransform(szTrans.X, szTrans.Y);

 

 

转载于:https://www.cnblogs.com/gadfly/archive/2010/07/28/1786572.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值