使用不同字体调整 FL_Widget 中文本的垂直对齐方式
Posted
技术标签:
【中文标题】使用不同字体调整 FL_Widget 中文本的垂直对齐方式【英文标题】:Adjust the text's vertical alignment in a FL_Widget using different fonts 【发布时间】:2022-01-12 11:59:21 【问题描述】:我想使用其中一种可用字体而不是默认字体:以下程序的灵感来自test/fonts.cxx
中的源代码:
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
int main(int argc, char **argv)
Fl_Window* G_win;
G_win = new Fl_Window(300,100,"The font test");
Fl_Box* A = new Fl_Box(30,30,110,50,"The font TEST.");
A -> box(FL_UP_BOX);
int i = 0;
int k = Fl::set_fonts(i ? (i>1 ? "*" : 0) : "-*");
Fl_Box* B = new Fl_Box(145,30,110,50,"The font TEST.");
B -> box(FL_UP_BOX);
B -> labelfont(419);
G_win->show();
return(Fl::run());
labelfont
命令设置小部件的字体对应于提供的int
值(在示例中,419 对应于 Papyrus)。问题是垂直对齐方式不同,如下图所示:
这是其他字体会出现的问题,而不仅仅是 Papyrus。我在配备 Big Sur (11.6) 的 macBookPro 上使用 FLTK 1.3.5,我还在配备 Ubuntu 19.04 的 Linux 机器上测试了上述代码:即使在后一种情况下,问题仍然存在。
有没有办法像默认字体一样设置垂直位置?
【问题讨论】:
标签在您的图像中显示得更高。我在类似的代码上尝试了它,基本上迭代了几种系统字体,它们在我的 kubuntu vm 上看起来不错(也在 Windows 上试过)。所以你可能会遇到某种问题。您使用的是什么版本的 fltk?您是否也在使用 pango 支持进行构建?您也可以尝试继承 Fl_Box 并覆盖 draw() 以使用 fl_draw_box() 绘制一个 upbox,然后使用 fl_draw(label(), x, y, w, h, FL_ALIGN_CENTER) 在顶部绘制文本。 我已经在我的Linux机器上测试了代码,配备了Ubuntu 19.04,我在一些字体上也遇到了同样的问题。我在配备 Big Sur OS 的 macBookPro 上使用 fltk 1.3.5。老实说,我不知道 pango 支持是什么。我考虑将 Box 类(以及我将要使用的其他类)子类化来解决这个问题,但我想看看是否有更快的解决方案。 Pango 库是 FLTK 可以在带有 X11 的 Linux (Unix) 上使用的一个选项。我不认为这是 macOS 上的一个选项。它改进了文本渲染,并且如果您需要渲染的字符不在当前使用的字体中,它能够使用替换字体。如果您使用的是 macOS,这不适合您。 【参考方案1】:如果依赖标准的标签绘图,则无法根据字体属性设置对齐方式。此标签绘图代码使用 (IIRC) fl_measure() 来测量和定位标签。这依赖于字体属性,并且可能会出现上述差异。 FLTK 使用 fl_measure() 是因为它比 fl_text_extents() 快。
如果这对您来说真的很重要,您将不得不派生自己的类并用您自己的使用 fl_text_extents() 的代码覆盖 draw() 代码,请参阅文档: https://www.fltk.org/doc-1.4/group__fl__attributes.html#ga14cb75a92b6cdd576f9512b38a208f8b
您还可以查看测试/单元测试(构建并运行它),选择显示 fl_measure() 和 fl_text_extents() 之间差异的“渲染文本”。
【讨论】:
哦,我错过了unittest
program,谢谢!因此,唯一的方法是派生我的类,并尝试调整所使用字体的对齐方式。
如果这对你来说很重要,那么是的,恐怕这就是你需要做的。通常默认文本对齐方式(使用 fl_measure() 定位)就足够了。
我正在处理这个问题:我写了一个新问题here,与这个问题相关。也许您可以提供一些建议和/或提示。以上是关于使用不同字体调整 FL_Widget 中文本的垂直对齐方式的主要内容,如果未能解决你的问题,请参考以下文章
将UIView中UILabel的字体大小调整为不同的设备大小