【问题标题】:Get current/default font for widget(s) in gtkada (GTK3)在 gtkada (GTK3) 中获取小部件的当前/默认字体
【发布时间】:2019-02-03 23:25:10
【问题描述】:

已经创建了一个显示 Text_View 的程序。我设置了按钮以允许用户更改配色方案和字体。效果很好。

但是当程序第一次启动时,它会使用当前 GTK3 主题设置的任何字体。

我想做的是找出当前字体是什么(在用户选择更改系列、重量或大小之前),获取字体大小,对其应用缩放因子,以应用于我输出到 Text_View 的几行介绍性文本。

我已经尝试在这里查看较旧的答案,但他们似乎使用了已弃用的选项 (GTK2),这些选项似乎不可用。

提前感谢您的帮助。

【问题讨论】:

    标签: gtk ada


    【解决方案1】:

    不是 GtkAda 方面的专家,但给你一些指点(链接是 GtkAda 来源):

    在 GTK+ 3 中,您可以使用 Get_Style_Context 查询小部件的样式。这会返回一个Gtk_Style_Context,它基本上是一个类似 CSS 属性的容器。

    您正在寻找font property font-size,您可以使用Get_Property 进行查询。

    查询后,您创建了一个Gtk_Text_Tag。最方便的方法是通过Get_Buffer 查询视图的缓冲区,然后使用Create_Tag

    您需要根据您查询的值设置Size_PropertySize_Points_Property(添加所需的附加大小)。我不确定尺寸是以 Pango 单位还是以点为单位返回的,您需要弄清楚这一点。无论如何,您必须Size_Set_Property 设置为True

    最后,您在视图的缓冲区上调用 Apply_Tag 以将标记应用于给定范围内的文本。

    【讨论】:

      【解决方案2】:

      是的,这帮助我指明了正确的方向。这几天我一直在兜圈子。还有一些事情要做,整理一下代码,但发现这行得通:

      声明:

        The_Style_Context : Gtk_Style_Context;
        The_Font_Size     : Gint;
        The_Font_Desc     : Pango_Font_Description;
        The_State         : Gtk.Enums.Gtk_State_Flags := 1;
        The_Tag           : Gtk_Text_Tag;
        Tags              : Gtk_Text_Tag_Table;
        Iter, Start_Iter  : Gtk_Text_Iter;
        Title_Scale       : Constant := 2;
        TextBuffer        : Gtk_Text_Buffer;
        TextView          : Gtk_Text_View;
      

      假设我们已经创建了一个新窗口 (Win)、任何必要的框等,以及文本视图。现在我们这样做:

      The_Style_Context := Get_Style_Context (Win);
      The_Font_Desc := Get_Font (The_Style_Context, The_State);
      The_Font_Name := To_Unbounded_String (Get_Family (The_Font_Desc));
      The_Font_Size := Get_Size (The_Font_Desc);
      Gtk_New (Tags);
      Gtk_New (The_Tag, "title_tag");
      Add (Tags, The_Tag);
      

      接下来的行采用当前字体的大小并将其乘以我在声明部分选择的比例。

      Set_Property (The_Tag, Size_Property, The_Font_Size * Title_Scale);
      

      创建文本缓冲区和文本视图。

      Gtk_New (TextBuffer, Tags);
      Gtk_New (TextView, TextBuffer);
      

      假设我们为 Text_View 和其他一些初始格式选项设置了边距。设置一些文本,然后应用标签的格式:

      TextBuffer.Set_Text ("Hello, world.");
      
      Get_End_Iter (TextBuffer, Iter);
      Get_Start_Iter (TextBuffer, Start_Iter);
      Apply_Tag (TextBuffer, The_Tag, Start_Iter, Iter);
      

      显示窗口,我们就完成了。

      【讨论】:

        猜你喜欢
        • 2023-01-24
        • 1970-01-01
        • 2017-11-12
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        • 2014-01-21
        • 2013-07-12
        • 1970-01-01
        相关资源
        最近更新 更多