zoukankan      html  css  js  c++  java
  • 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图形输出误差解决代码如下:


        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);

     

  • 相关阅读:
    Python pymysql
    Zk 集群概念
    k8s教程
    Python 经典类和新式类
    Python 私有属性
    Python 高级面向对象
    Python 面向对象5 多态
    MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
    MyBatis学习总结(七)——Mybatis缓存
    MyBatis学习总结(六)——调用存储过程
  • 原文地址:https://www.cnblogs.com/gadfly/p/1786572.html
Copyright © 2011-2022 走看看