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

news2024/9/30 23:24:59

一、需求

想要绘制如下所示的斜体字,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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/545152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5个视频剪辑必备素材库、视频、配乐、音效全部免费下载。

推荐几个免费视频、配乐素材网站,可商用,建议收藏! 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库网素材非常丰富,网站主要还是以设计类素材为主,高清视频素材也很多,像风景、植…

Jmeter响应断言

1、断言介绍 断言用于检查测试中得到的响应数据是否符合预期,用以保证性能测试过程中的数据交互与预期一致。 Request请求成功了,并不代表结果一定正确。所以通过断言,我们不再会被200状态码所迷惑,而是可以通过断言&#xff0c…

搭建新项目 前端环境 及启动项目前的相关配置

** 搭建新项目 前端环境 及启动项目前的相关配置 ** 文章目录 搭建新项目 前端环境 及启动项目前的相关配置 前言一、编程 语言及框架二、步骤1.打开 VS2.导入项目3、配置地址及 请求端口4、启动项目5、查看报错 的日志文件6、运行 命令 安装相关有依赖及 jar 包7、特别要注…

前端学习--Vue(3)初始化vue项目

一、侦听器 1.1 概念 watch 侦听器允许开发者监视数据的变化&#xff0c;从而针对数据的变化做特定的操作 <div id"app"><span>字典查询</span><input type"text" v-model.lazy"uname"></div><script src&qu…

浅析视频技术与AI智能识别技术在智慧矿山场景中的应用

一、背景分析 能源与矿业是我国国民经济的重要物质生产部门和支柱产业之一&#xff0c;同时也是一个安全事故多发的高危行业&#xff0c;施工阶段的现场管理对工程成本、进度、质量及安全等至关重要。国家矿山安监局陆续发布(矿安〔2022)128号)文、(矿安综〔2023〕5号)文推动矿…

数据结构之树和二叉树

目录 一、树简介 二、二叉树 1、简介 2、二叉树的性质 3、满二叉树和完全二叉树 三、二叉树的遍历 四、二叉树遍历代码实现 五、二叉搜索树&#xff08;Binary Search Tree&#xff09; 1、简介 2、二插搜索树的局限性 六、平衡二叉搜索树&#xff08;AVL树&#x…

【Spring框架】--04.单元测试JUnit、事务、资源操作Resources、国际化、数据校验Validation、提前编译AOT

文章目录 6.单元测试&#xff1a;JUnit6.1整合JUnit56.1.1搭建子模块6.1.2引入依赖6.1.3添加配置文件6.1.4添加java类6.1.5测试 6.2整合JUnit46.2.添加依赖6.2.2测试 7.事务7.1JdbcTemplate7.1.1简介7.1.2准备工作7.1.3实现CURD①装配 JdbcTemplate②测试增删改功能③查询数据返…

docker 使用记录

要点&#xff1a; 参考&#xff1a;https://www.cnblogs.com/yurenjun/p/15991062.html 一 打包部署步骤 参考&#xff1a; Docker教程&#xff08;超全总结&#xff09;_生信技术的博客-CSDN博客 参考部署基础操作&#xff1a;如何用Docker打包部署自己写的项目&#xff1f;…

中介中心性算法原理与源码解析(Between Centrality)

前言 中介中心性(Between Centrality)&#xff0c;或者叫介数中心性&#xff0c;是基于最短路径对关系图谱中节点的中心性进行测量的典型图论算法。和其它的图论中心性算法一样&#xff0c;中介中心性用来衡量社会关系网络中&#xff0c;个人、企业或者其它的实体在整个网络中…

stm32wb15cc蓝牙芯片学习

由于项目选型需要&#xff0c;初次接触stm32的蓝牙芯片&#xff0c;需要总体做一些学习。也记些笔记&#xff0c;防止遗忘。 一、主要的ST的蓝牙芯片 简单介绍一下主要ST的蓝牙芯片 1.1. STM32WB系列 这个系列的芯片是一个双核的MCU&#xff0c;相当于一个普通的STM32 MCU和…

全面分析低代码平台:各大热门产品详细对比

低代码平台彻底改变了企业构建和部署定制应用程序的方式。它们提供了一种用最少的代码&#xff0c;更快、更高效地开发软件的方法。使得公司在加快创新的同时节省了时间和资源。对于一些想进行数字化转型&#xff0c;选择低代码平台入门的中小企业来讲&#xff0c;应该选择哪个…

NTP时间服务器同步时钟系统安装汇总分享

在现代科技发展的背景下&#xff0c;各种设备的时间同步变得越来越重要。同步时钟管理系统的应用可以让多个设备在时间上保持一致&#xff0c;提高工作效率和安全性&#xff0c;为各个行业的发展提供了重要的支持。 一、同步时钟系统介绍 同步时钟管理系统的应用范围非常广泛&…

私有化部署的即时通讯软件:消息、文件安全加密,全面可控

如今&#xff0c;数字化转型进入纵深阶段&#xff0c;在企业数字化转型过程中&#xff0c;数据规模激增&#xff0c;结构更为复杂&#xff0c;数据零散化和安全性问题日益显著&#xff0c;使得众多企业在数据资产管理上面临不小的挑战。企业为提高内部沟通效率&#xff0c;通常…

C++源码分析完美转发

C源码分析完美转发 完美转发作用&#xff1a; 可以保持实参数据在函数中的左值或者右值类型。 不使用完美转发的后果 #include<iostream> using namespace std;// 容器里面元素的类型 class A { public:A() {}// 带左值引用参数的赋值函数A& operator(const A&…

24 KVM管理虚拟机-配置VNC-TLS登录

文章目录 24 KVM管理虚拟机-配置VNC-TLS登录24.1 概述24.2 操作步骤 24 KVM管理虚拟机-配置VNC-TLS登录 24.1 概述 VNC服务端和客户端默认采用明文方式进行数据传输&#xff0c;因此通信内容可能被第三方截获。为了提升安全性&#xff0c;openEuler支持VNC服务端配置TLS模式进…

在光伏行业的自动化生产中,EAP起到了什么作用?

随着可再生能源的快速发展和环保意识的增强&#xff0c;光伏行业作为一种清洁能源产业正迅速崛起。光伏生产过程的自动化已成为行业的追求和趋势。在光伏行业的自动化生产中&#xff0c;EAP&#xff08;设备自动化程序&#xff09;系统发挥着关键的作用&#xff0c;为生产线的运…

drawio@绘制带有latex公式的图表@示意图@流程图@白板模式whiteboard

文章目录 drawio绘制带有latex公式的图表示意图流程图白板模式whiteboard使用drawio小结 公式编辑Use mathematical typesetting in diagramsUse mathematical typesetting in diagramsTroubleshooting关于文本框元素公式渲染问题&#x1f388;Maths is not rendered 模式切换d…

【K哥爬虫普法】你很会写爬虫吗?10秒抢票、10秒入狱,了解一下?

我国目前并未出台专门针对网络爬虫技术的法律规范&#xff0c;但在司法实践中&#xff0c;相关判决已屡见不鲜&#xff0c;K 哥特设了“K哥爬虫普法”专栏&#xff0c;本栏目通过对真实案例的分析&#xff0c;旨在提高广大爬虫工程师的法律意识&#xff0c;知晓如何合法合规利用…

【TES745D】基于复旦微的FMQL45T900 全国产化ARM 核心模块(100%国产化)方案设计中文资料

板卡概述 TES745D 是一款基于上海复旦微电子FMQL45T900 的全国产化ARM 核心板。该核心板将复旦微的FMQL45T900&#xff08;与XILINX 的XC7Z045-2FFG900I 兼容&#xff09;的最小系统集成在了一个87*117mm 的 核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩…

主成分分析(PCA)直观理解与数学推导

近期在完成信息论的作业&#xff0c;发现网上的资料大多是直观解释&#xff0c;对其中的数学原理介绍甚少&#xff0c;并且只介绍了向量降维&#xff0c;而没有介绍向量重构的问题&#xff08;重构指的是&#xff1a;根据降维后的低维向量来恢复原始向量&#xff09;&#xff0…