主要来源于这篇文章
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);
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);
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](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
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);