【问题标题】:GTK: Using an Offscreen Window to investigate the rendered dimensions of widgetsGTK:使用离屏窗口调查小部件的渲染尺寸
【发布时间】:2015-06-24 22:52:17
【问题描述】:

我正在使用 Gtk.Offscreen_Window 来调查各种屏幕外小部件的高度,以便根据它们的高度确定将它们放置在屏幕上的哪个位置。我设法用下面的伪代码完成了这个。

procedure My_Proc 
is
    use Gtk.Offscreen_Window;
    use Gtk.Box;
    Offscreen : Gtk_Offscreen_Window := Gtk_Offscreen_Window_New;
    Box       : Gtk_Box := Gtk_Box_New ( Orientation_Vertical );
begin
    Offscreen.Set_Default_Geometry ( 1000, 1000 );
    Offscreen.Add ( Box );
    Offscreen.Show_All;
    Ada.Text_IO.Put_Line( Glib.Gint'Image ( Box.Get_Allocated_Height ));
end My_Proc;

此代码将正确告诉我 Box 的高度。请注意,我的原始代码比这要复杂一些,但为了发布这篇文章,我已经对其进行了简化。

这里的问题与 Offscreen.Show_All 过程有关。我知道这对于 Offscreen 小部件来说是不正确的做法,因为它不能像普通窗口一样显示。执行此代码时控制台上显示的警告进一步强调了这一点:

(main:26724): Gdk-WARNING **: /build/buildd/gtk+3.0-3.10.8/./gdk/x11/gdkwindow-x11.c:5531 drawable is not a native X11 window

如果不包括 Show_All 函数,大小计算将不正确(返回 1),因此 Show_All 函数似乎在做一些重要的事情,尽管有点太多了。我相信解决方案就像找出在 Show_All 函数中运行分配计算并直接运行它一样简单。不幸的是我不知道那个函数是什么。

所以底线是:如何正确指示 Offscreen_Window 小部件在不使用 Show_All 函数的情况下执行其大小计算?

谢谢。

我正在使用 Ada 2012、GtkAda(自 2015 年中以来的最新版本)、Linux Kubuntu 14.04,但也希望它能够在 Windows 7/8 中运行。

【问题讨论】:

  • 为什么不让container 处理布局?
  • 因为它没有使用 Get_Allocated_Height 返回正确的大小信息。即使它的大小是使用 Size_Allocate 设置的,也总是返回 1。在不将小部件连接到主窗口的情况下,我设法返回正确高度的唯一方法是使用 Offscreen_Window 和 Show_All 的组合。

标签: gtk ada gtk3


【解决方案1】:

我最近了解到,对于我的情况,使用 Gtk.Widget.Size_Request 函数比使用 Gtk.Widget.Get_Allocated_Height 来找出高度更正确我新生成的小部件。使用它可以消除对 Gtk.Widget.Show_All 的错误使用。

再次感谢您的帮助。

【讨论】:

  • 我对这种方法持谨慎态度,因为结果将取决于遇到的特定几何形状,这在其他环境中可能不正确。相反,依赖封闭容器来(递归地)调整嵌套容器的大小,如 here 所讨论的那样。
猜你喜欢
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 2018-12-23
相关资源
最近更新 更多