绘制镜像字体

//绘制镜像字体

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


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值