现在的位置: 首页 > 综合 > 正文

绘制镜像字体

2013年10月01日 ⁄ 综合 ⁄ 共 1581字 ⁄ 字号 评论关闭
//绘制镜像字体

void Draw_Mirror_Text(CDC *pDst_DC,//目标设备句柄 
  CPoint dst_Point,//目标位置  
  LPCTSTR drawText,//目标字符串  
  COLORREF textColor, //字体颜色  
  bool Mirror_X,//X轴镜像  
  bool Mirror_Y //Y轴镜像  
)
{
  if(pDst_DC && pDst_DC->m_hDC) //设备句柄有效  
  {   
    //创建兼容内存设备
    CDC memDC;
    memDC.CreateCompatibleDC(pDst_DC);
    int saveDC = memDC.SaveDC(); //保存设备状态    

    //获取字符串大小
    CSize text_size = memDC.GetTextExtent(drawText);
    CRect rect(0,0,text_size.cx,text_size.cy);

     //创建兼容位图
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(pDst_DC,rect.Width(),rect.Height());
    CBitmap *pBitmap = memDC.SelectObject(&bitmap); //选入位图

    //填充白色背景色
    CBrush brush(RGB(255,255,255));
    memDC.FillRect(rect,&brush);

    //正常模式绘制字体
    int saveMode = memDC.SetMapMode(MM_TEXT);
    int savebkMode = memDC.SetBkMode(TRANSPARENT);//不更改背景色
    COLORREF saveTextColor = memDC.SetTextColor(textColor);//设置字体颜色
    memDC.TextOut(0,0,drawText);//绘制字体
    memDC.SetTextColor(saveTextColor);//恢复字体颜色
    memDC.SetBkMode(savebkMode);//恢复映射模式
    
    //主要是用SetViewportExt 和 SetViewportOrg 做坐标翻转
    memDC.SetMapMode(MM_ISOTROPIC);
    CSize saveWindowExt  = memDC.SetWindowExt(1,1);
    int vp_cx = 1,vp_cy = 1;
    if(Mirror_X) vp_cx = -1;
    if(Mirror_Y) vp_cy = -1;
    CSize saveViewport = memDC.SetViewportExt(vp_cx,vp_cy);
    int vporg_x = 0,vporg_y = 0;
    if(Mirror_X)vporg_x = rect.Width()-1;
    if(Mirror_Y)vporg_y = rect.Height()-1;
    CPoint saveViewportOrg = memDC.SetViewportOrg(vporg_x,vporg_y);

    //贴图到目标设备的目标位置
    pDst_DC->BitBlt(dst_Point.x,dst_Point.y,rect.Width(),rect.Height(),&memDC,0,0,SRCAND);

    //恢复内存设备信息
    memDC.SetViewportOrg(saveViewportOrg);
    memDC.SetViewportExt(saveViewport);
    memDC.SetWindowExt(saveWindowExt);
    memDC.SetMapMode(saveMode);

    //释放对象 销毁内存设备
    memDC.SelectObject(pBitmap);
    bitmap.DeleteObject();
    memDC.RestoreDC(saveDC);
    memDC.DeleteDC();
  }
}

 

【上篇】
【下篇】

抱歉!评论已关闭.