MiniGUI TTF旋转字库制作并竖直显示文字

6 篇文章 0 订阅
15 篇文章 21 订阅

一. 制作TTF旋转字库

1.下载fontforge,可以在Ubuntu软件中心下载

FontForge

2. 用该软件打开字库之后,按ctrl+a全选文字

全选文字

3.点击上面工具栏的基础–>变换–>如图设置

变换
需要注意的是

  1. 需要选择字形原点,不能按选中部分的中心旋转,不然会导致汉字与数字和英文显示的高度不在同一水平线上,如果按选中部分的中心旋转,第3步换成第4步
  2. 需要选择顺时针旋转90度,如果逆时针旋转90度的话,文字显示会由“你好”变成“好你”,并且对齐方式是向右对齐,需要做一些额外的处理
  3. 需要选择向Y轴移动220个单位,不同字体可能需要移动的数字不同,可以在MiniGUI中用TextOut函数设置y的值为0,看文字是否显示在y为0的位置上,动态调试
  4. 第2步旋转之后,只选择数字和英文,点击基础–>变换,选择字形原点,选择向Y轴移动100个单位,之后点击尺寸–>设置左边位,设置好数值,然后在MiniGUI中观看效果,动态调试
  5. 因为MiniGUI的TextOut,DrawText函数不支持竖直输出文本,需要修改MiniGUI源码,使文字竖直输出

这里对上面的一些概念做一些说明,还没有旋转之前
概念描述
当按中心旋转之后,左边位变成-25,所以需要调整左边位,不然数字与汉字显示不在同一水平线上,因为汉字宽高都是256,所以汉字不需要调整左边位
按中心旋转
当按原点旋转之后,Y轴距离变大了很多,所以需要向上移动一定的距离,不然文字显示的时候会空出一些,因为是按原点旋转,汉字与数字可以显示在同一水平线上,因此可以不用改动左边位,但是我们也可以看到,左边位也是变小了,也可以根据需要修改
按原点旋转

4.文件–>生成字体–>TrueType

生成字体

二. MiniGUI竖直显示文本

主要是把下一次输出的x,y轴的坐标对换就可以了,新增Align

描述
TA_HORIZONTAL水平输出
TA_HORIZONTAL_UT水平输出,字库旋转180度
TA_VERTICAL_CW竖直输出,字库顺时针旋转
TA_VERTICAL_CCW竖直输出,字库逆时针旋转

SetTextAlign只影响当前hdc,对其他界面无影响
在调用TextOut和TabbedTextOut函数之前调用SetTextAlign(hdc,TA_VERTICAL_CW),调用SetTextAlign(hdc,TA_HORIZONTAL)可以恢复该hdc为水平输出文字

DrawText不受SetTextAlign的影响,新增Align

描述
DT_HORIZONTAL_UT水平输出,字库旋转180度
DT_VERTICAL_CW竖直输出,字库顺时针旋转
DT_VERTICAL_CCW竖直输出,字库逆时针旋转

在调用DrawText的时候可以指定文字输出风格,不指定这两个风格为水平输出

为什么需要区分字库顺时针旋转和逆时针旋转,这里主要涉及到换行的问题,水平输出的情况下,换行是Y轴加一个字的高度。竖直输出,字库顺时针旋转的情况下是X轴减少一个字的高度。竖直输出,字库逆时针旋转的情况下是X轴增加一个字的高度,并且需要注意,想要输出“你好啊”,源字符串需要是“啊好你”,如果是两行的话,还需要向右对齐,当然MiniGUI中是支持双向文本的,补丁中已经做好了支持,具体效果如下,以下的字符串都是“测试文本\nABCDEFGHIGK”
文本位置
文本位置
TextOut和TabbedTextOut指定了TA_VERTICAL_CCW之后,字符串也是不用手动逆转
原本DrawText指定DT_RIGHT和竖直输出文本之后,位置和设定的位置会有偏差,补丁中也已经修复
需要注意的是DrawText指定竖直输出后,DT_BOTTOMDT_VCENTERDT_CENTER不能再使用

使用示例如下

	case MSG_PAINT: {
		HDC hdc = BeginPaint(hWnd);
		
		SetTextAlign(hdc,TA_VERTICAL_CW);
		TextOut(hdc, 10, 150, "你好啊");
		TabbedTextOut(hdc,200,300,"你好啊");
		
		RECT rcClient;
		rcClient.left = 10;
		rcClient.top = 240;
		rcClient.right = 400;
		rcClient.bottom = 400;
		DrawText(hdc, "你好啊", -1, &rcClient,
				DT_NOCLIP | DT_LEFT | DT_WORDBREAK | DT_VERTICAL_CW);

		TextOut(hdc, 250, 140, "2:45");
		EndPaint(hWnd, hdc);
		return 0;
	}

关键点说明

DrawText函数,如果设置了竖直输出,则每绘制一个字,对调X,Y的坐标

diff --git a/src/newgdi/drawtext.c b/src/newgdi/drawtext.c
index 6f003b8..42e2290 100644
--- a/src/newgdi/drawtext.c
+++ b/src/newgdi/drawtext.c
@@ -370,8 +370,14 @@ static BOOL cb_drawtextex2 (void* context, Glyph32 glyph_value,
             break;
     }
 
-    ctxt->x += adv_x;
-    ctxt->y += adv_y;
+	if (!(ctxt->nFormat & DT_VERTICAL_CW)
+			&& !(ctxt->nFormat & DT_VERTICAL_CCW)) {
+		ctxt->x += adv_x;
+		ctxt->y += adv_y;
+	} else {
+		ctxt->x += adv_y;
+		ctxt->y += adv_x;
+	}
 
     return TRUE;
 }

DrawText函数,如果设置了竖直输出,则对输出区域的起点X,Y进行调整,使其位置不偏离

@@ -476,14 +483,25 @@ int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
     }
 
     /* set the start_x pos.*/
-    if (nFormat & DT_RIGHT){
-        x = rcDraw.right;
-        old_ta = SetTextAlign(hdc, TA_RIGHT);
-    }
-    else {
-        old_ta = SetTextAlign(hdc, TA_LEFT);
-        x = rcDraw.left;
-    }
+	if (nFormat & DT_RIGHT) {
+		x = rcDraw.right;
+		old_ta = SetTextAlign(hdc, TA_RIGHT);
+		if (nFormat & DT_VERTICAL_CW) {
+			x = rcDraw.right + (pdc->pLogFont->size >> 1);
+			y = rcDraw.bottom - pdc->pLogFont->size;
+		} else if (nFormat & DT_VERTICAL_CCW) {
+			x = rcDraw.left + pdc->pLogFont->size + (pdc->pLogFont->size >> 1);
+			y = rcDraw.bottom - pdc->pLogFont->size;
+		}
+	} else {
+		old_ta = SetTextAlign(hdc, TA_LEFT);
+		x = rcDraw.left;
+		if (nFormat & DT_VERTICAL_CW) {
+			x = rcDraw.right - (pdc->pLogFont->size >> 1);
+		} else if (nFormat & DT_VERTICAL_CCW) {
+			x = rcDraw.left + pdc->pLogFont->size - (pdc->pLogFont->size >> 1);
+		}
+	}
 
     if(nFormat & DT_CALCRECT){
         *pRect = rcDraw;

DrawText函数,如果设置了竖直输出,转换输出方向,使应用不用对字符串进行逆转

@@ -503,6 +521,11 @@ int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
     ctxt.x   = x;
     ctxt.y   = y;
 
+	if (nFormat & DT_VERTICAL_CCW)
+		direction = (pdc->ta_flags & TA_X_MASK) == TA_RIGHT;
+	else
+		direction = (pdc->ta_flags & TA_X_MASK) != TA_RIGHT;
+
     while (nCount > 0) {
         int line_x, maxwidth;
 

DrawText函数,指定了DT_VERTICAL_CW向左换行,DT_VERTICAL_CCW向右换行,水平输出是向下换行

@@ -597,13 +617,25 @@ int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
 
             line_len -= ctxt.nCount;
             pline  +=  ctxt.nCount;
-            y += ctxt.line_height;
+			if (nFormat & DT_VERTICAL_CW) {
+				ctxt.start_x -= ctxt.line_height;
+			} else if (nFormat & DT_VERTICAL_CCW) {
+				ctxt.start_x += ctxt.line_height;
+			} else {
+				y += ctxt.line_height;
+			}
             nLines ++;
         }
 
         /* continuous multiline '\n'.*/
         if ((nr_delim_newline-1) > 0){
-            y += ctxt.line_height * (nr_delim_newline-1);
+			if (nFormat & DT_VERTICAL_CW) {
+				ctxt.start_x -= ctxt.line_height * (nr_delim_newline - 1);
+			} else if (nFormat & DT_VERTICAL_CCW) {
+				ctxt.start_x += ctxt.line_height * (nr_delim_newline - 1);
+			} else {
+				y += ctxt.line_height * (nr_delim_newline - 1);
+			}
             nLines += (nr_delim_newline-1);
         }
 

TextOut和TabbedTextOut也是类似的处理,不再赘述

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MiniGUI 用户手册是一本详细介绍 MiniGUI 软件使用方法和功能的手册。MiniGUI 是一个嵌入式图形用户界面开发框架,它提供了丰富的绘图和窗口管理功能,可以实现嵌入式设备上的图形界面显示和交互操作。 用户手册内容包括 MiniGUI 的基本概念和架构,如窗口、控件、绘图等。手册中详细介绍了如何安装和配置 MiniGUI,包括编译和移植 MiniGUI 到不同硬件平台的步骤。用户手册还提供了 MiniGUI 的主要 API 接口的详细说明,包括窗口和控件的创建、显示、隐藏和销毁等操作的函数调用方式和参数说明。 此外,用户手册还包含了一些示例代码,以帮助用户更好地理解 MiniGUI 的使用方法。用户可以通过阅读示例代码,学习如何创建窗口和控件,如何处理用户输入事件,如何绘制图像和文字等。用户手册还提供了一些常见问题的解答和故障排除的方法,帮助用户解决在使用 MiniGUI 过程中可能遇到的问题。 MiniGUI 用户手册对于初学者来说是一个很好的入门指南,它详细介绍了 MiniGUI 的各个方面,帮助用户快速上手并能够独立开发嵌入式图形界面应用。用户可以根据手册的指导,按照自己的需求进行 MiniGUI 的配置和开发,实现自己想要的图形界面效果。总之,MiniGUI 用户手册是理解和使用 MiniGUI 的重要参考资料,对于开发者来说,它是不可或缺的工具。 ### 回答2: Minigui用户手册是一本关于Minigui图形用户界面开发框架的指南。Minigui是一个基于C语言开发的轻量级、可定制的GUI开发工具包。它可以帮助开发者快速构建各种图形界面应用程序。 这本用户手册涵盖了Minigui的各个方面,从安装和配置开始,一直到开发和调试。手册中详细介绍了如何使用Minigui的各种功能和组件,如窗口、按钮、菜单、对话框等,以及使用不同控件实现用户交互。手册还提供了丰富的示例代码和演示,帮助开发者更好地理解和应用Minigui的功能。 此外,手册还介绍了Minigui的特性和优势。它可以运行在各种类型的嵌入式设备上,具有较低的资源占用和快速的响应速度。Minigui还支持跨平台开发,可以在多种操作系统上运行,如Windows、Linux等。它还支持多国语言和字符集,帮助开发者构建全球化的应用程序。 Minigui用户手册不仅提供了技术内容,还对开发过程中的常见问题进行了解答,以及开发者应该遵循的最佳实践和规范。手册的目的是帮助开发者更加高效地利用Minigui进行图形界面开发,提升开发效率,并最大限度地减少错误和调试时间。 总之,Minigui用户手册是Minigui开发框架的一本重要参考资料,它提供了详尽的技术指导和实例代码,帮助开发者快速上手并开发出高质量的图形界面应用程序。无论是初学者还是经验丰富的开发者,都可以从中受益并提升他们的开发技能。 ### 回答3: minigui 用户手册是一本介绍和指导用户如何使用 minigui 软件的手册。minigui 是一个开源的图形用户界面(GUI)开发框架,它提供了丰富的图形界面组件和功能,能够帮助开发人员快速构建跨平台的图形界面应用程序。 minigui 用户手册从基础开始,介绍了 minigui 开发环境的安装和配置方法,以及如何创建和编译一个 minigui 应用程序。接着,手册详细介绍了 minigui 的各种图形界面组件,如窗口、按钮、文本框等,以及它们的使用方法和属性设置。用户可以通过手册学习如何创建和布局这些组件,以及如何响应用户的交互事件。 除了组件的介绍,minigui 用户手册还提供了大量的示例代码和实践案例,让用户可以更好地理解和应用 minigui 的各种功能。手册还解释了 minigui 的一些高级特性,如绘图和图像处理,以及如何与后台服务进行通信,从而帮助用户开发更加复杂和实用的应用程序。 minigui 用户手册还对 minigui 的开发工具和调试方法进行了介绍,帮助用户更好地进行开发和调试工作。手册也提供了一些常见问题和解决方案,以及一些开发经验和技巧,供用户参考。 总而言之,minigui 用户手册是一本全面介绍 minigui 软件的指南,它帮助用户快速入门,掌握 minigui 的使用方法,并通过实践和示例代码提供了更深入的学习和开发体验。无论是初学者还是有经验的开发人员,都可以从 minigui 用户手册中获得帮助和指导,提升图形界面应用程序的开发效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

anyuliuxing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值