【GDI+】旋转文本/斜体字

文章介绍了如何利用GDI+的Graphics类方法RotateTransform和TranslateTransform,通过三个步骤实现文字的中心旋转。首先平移画板原点到文字区域中心,然后逆时针旋转45度,最后在新原点绘制字符并恢复原始状态,从而达到45度斜体字的效果。
摘要由CSDN通过智能技术生成

一、需求

想要绘制如下所示的斜体字,45度

二、分析&思路

Graphics类有个 RotateTransform方法,可以传入任意角度的值来旋转画板。但是这个方法的旋转中心是画板的左上角,所以直接单单用这个方法不能满足我们的需求。此外, Graphics类还有个 TranslateTransform方法可以改变坐标的原点,而且这个方法是沿着矩形的x,y轴平移的,即就算图片旋转了一定的角度后,再调用 translatetransform 方法,它还是沿着x,y轴平移。于是通过以下三个步骤即可实现图片中心旋转。 

旋转前字体区域顶部为AB,旋转后字体区域顶部为CB
文本AB,旋转后为CB
1、将原点平移到C点
2、绕着新原点C点逆时针旋转45°
3、在新原点C处绘制字符
4、取消旋转
已知:AB=BC=width,∠ABC=45°,B坐标为(Xb,Yb),原点在左上角,求C坐标。
CD = BD = BC ÷ √2 = width ÷ √2
Xc = Xb - BD = Xb - width ÷ √2 
Yc = Yb + CD = Yb +  width ÷ √2

 

 三、代码

#define TOP_EMPTY_HEIGHT 10
#define LEFT_YRULE_WDITH 50 //左侧Y轴间隔
#define RIGHT_YRULE_WDITH 15//右侧Y轴间隔
#define BOTTOM_XRULE_HEIGHT 80 //底部X轴的高度
#define TEXT_RECT_WIDTH 55	//文字区域宽度
#define TEXT_RECT_HEIGHT 13	//文字区域高度

DoPaint(HDC hDC, const RECT& rcPaint)
{
    RECT rectFrame = m_rcItem;
	rectFrame.top += TOP_EMPTY_HEIGHT;
	rectFrame.left += LEFT_YRULE_WDITH;
	rectFrame.right -= RIGHT_YRULE_WDITH;
	rectFrame.bottom -= BOTTOM_XRULE_HEIGHT;
  
    Gdiplus::Graphics graphics(hDC);
    int nFont = 12; //字体大小
    DWORD dwTxtColor = 0xFF999999;//文字颜色
    wstring strText = L"软件服务";
    RECT rcText;//原字体区域
    rcText.right = rectFrame.left + 10;
	rcText.left = rcText.right - TEXT_RECT_WIDTH ;
    
    //---------------------------------------------字体样式---------------------------------------
    //字体
    Gdiplus::FontFamily fontFamily(L"微软雅黑");
    Gdiplus::Font font(&fontFamily, (Gdiplus::REAL)nFont, Gdiplus::FontStyleRegular, Gdiplus::UnitPixel);
    //画刷
    Gdiplus::SolidBrush brush(dwTxtColor );
    //字符格式
    Gdiplus::StringFormat stringformat;
    stringformat.SetAlignment(Gdiplus::StringAlignmentFar);// 对应右对齐DT_RIGHT
    stringformat.SetLineAlignment(Gdiplus::StringAlignmentCenter);//对应垂直居中DT_VCENTER
    stringformat.SetTrimming(Gdiplus::StringTrimmingEllipsisCharacter);//句末显示不完是否使用...代替DT_END_ELLIPSIS
    stringformat.SetFormatFlags(Gdiplus::StringFormatFlagsNoWrap);//对应单行显示DT_SINGLELINE
    
    //---------------------------------------------绘制不旋转的字符---------------------------------------
    Gdiplus::RectF rcfText1(rcText.left, rcText.top, TEXT_RECT_WIDTH, TEXT_RECT_HEIGHT);
    graphics.DrawString(strText.c_str(), -1, &font, rcfText1, &stringformat, &brush);
    
    //----------------------------------------------绘制旋转字符---------------------------------------
    //translatetransform平移 + rotatetransform旋转
    //1、把画板(graphics对象)原点平移到位置(x, y)
    float x = rcText.right - TEXT_RECT_WIDTH / sqrt(2);
    float y = rcText.top + TEXT_RECT_WIDTH / sqrt(2);
    graphics.TranslateTransform(x, y);
    //2、绕新原点(x, y)逆时针旋转画板45度
    graphics.RotateTransform(-45);
    //3、在新原点(x, y)处绘制字符
    Gdiplus::RectF rcfText2(0, 0, TEXT_RECT_WIDTH , TEXT_RECT_HEIGHT );
    graphics.DrawString(strText.c_str(),-1, &font, rcfText2, &stringformat, &brush);
    //4、取消旋转
    graphics.ResetTransform();
}

 

参考:

1、C# 使用 GDI+ 实现添加中心旋转(任意角度)的文字_C#_服务器之家

2、GDI+ 中图像矩阵变换_litanyuan的博客-CSDN博客

3、https://greambwang.blog.csdn.net/article/details/98651600

4、关于Duilib中字体穿透变暗的几种可能性解决方案_8687137的技术博客_51CTO博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值