使用不同字体调整 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() 之间差异的“渲染文本”。

【讨论】:

哦,我错过了unittestprogram,谢谢!因此,唯一的方法是派生我的类,并尝试调整所使用字体的对齐方式。 如果这对你来说很重要,那么是的,恐怕这就是你需要做的。通常默认文本对齐方式(使用 fl_measure() 定位)就足够了。 我正在处理这个问题:我写了一个新问题here,与这个问题相关。也许您可以提供一些建议和/或提示。

以上是关于使用不同字体调整 FL_Widget 中文本的垂直对齐方式的主要内容,如果未能解决你的问题,请参考以下文章

将UIView中UILabel的字体大小调整为不同的设备大小

自动调整不同设备字体大小的最佳方法?

垂直对齐底部 div 与不同大小的文本

C# WinForms TextBox 等的垂直对齐

Xamarin Forms 将不同字体大小的标签垂直对齐到同一基线

在 Qt 表单的不同布局中调整按钮大小