【发布时间】: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 的组合。