Gtk Z-序混沌

Gtk Z-序混沌,gtk,gtk2,z-order,Gtk,Gtk2,Z Order,我有以下小部件结构: w:GtkWindow f:GtkFixed da:GTKDrawingara cf:GtkFixed cda:GTKDrawingara i:GtkIcon s1:GTK调整 s2:GTK调整 它们按插入顺序列出(gtk_container_add插入到w中,gtk_fixed_put用于所有其他iSeries)。在所有小部件放置并调整大小后,cf与da完全重叠;cda、i、s1和s2不重叠并覆盖相邻区域。 当此结构暴露时,从上到下的外观顺序如下: cda结束 da结束

我有以下小部件结构:

w:GtkWindow
f:GtkFixed
da:GTKDrawingara
cf:GtkFixed
cda:GTKDrawingara
i:GtkIcon
s1:GTK调整
s2:GTK调整
它们按插入顺序列出(gtk_container_add插入到w中,gtk_fixed_put用于所有其他iSeries)。在所有小部件放置并调整大小后,cf与da完全重叠;cda、i、s1和s2不重叠并覆盖相邻区域。 当此结构暴露时,从上到下的外观顺序如下:

cda结束
da结束
s1、s2、i

da被屏蔽,仅接收暴露信号;da在视觉上模糊了s1和s2,但鼠标事件是由s1和s2发送和处理的-事件有点像“坠落”da

怎么回事?为什么Gtk会将da粘贴在兄弟容器小部件中以及兄弟的孩子之间?(我想这会让他们成为侄子和侄子,哈哈:)

我想让da成为窗户的“背景”;几个兄弟GtkFixed最终将被插入到f中,它们之间可能会有一些间隙,我需要在背景da上绘制,我完全同意da的部分被其他小部件遮挡。我不想为每个间隙创建多个绘图区域


我想我所描述的是一种常见的Z-排序,由于某种原因,它在我的例子中不起作用。哦,我一定要使用Gtk 2。

如果你使用GtkFixed,那么你应该得到“该死的”行为。永远不要用它!它破坏了可访问性。它违反了UI设计规则。筑巢是一场噩梦。你的朋友会和你断绝关系,你的狗会穿着你的拖鞋离开迪亚罗西亚。如果您想挑战现代编码实践,请使用GOTO或动态修改您的代码段,但不要使用GtkFixed。

由于没有专家能够帮助我的新手解决问题,我必须成为专家,研究源代码并自行开发解决方案。给你

问题是在Gtk中,小部件结构与窗口结构不对应。默认情况下,GtkFixed没有相应的窗口,因此在我的示例中,窗口结构如下所示:

w:GtkWindow
f:GtkFixed(*无窗口*)
da:GTKDrawingara
cf:GtkFixed(*无窗口*)
cda:GTKDrawingara
i:GtkIcon
s1:GTK调整
s2:GTK调整

基本上是平的。所以,所有小部件窗口都以任意顺序插入w.window,这导致da显示在它的“侄子”之间

因此,解决方案是告诉GtkFixed拥有自己的窗口:

cf:=gtk_fixed_new();

gtk_widget_set_有一个窗口(cf,1)

Paul,在知道我选择使用GtkFixed的原因之前,你太快了,无法做出判断。至于“现代编码实践”——见鬼去吧!不管它们是什么,它们都会让程序变胖!我正在扩展一个功能齐全的文本编辑器和IDE(编译器+调试器+链接器),它的运行速度略低于1MB或RAM(是的,MB,而不是GB!)——现代系统提供了相同的功能,但占用了数千倍(字面上!)的资源。在我看来,Gtk只是Z顺序无关的。这将是一个很好的编程实践,只是在文档中的某个地方故意明确地声明它,而不是提供一个小部件并强烈反对使用它!我已经阅读了所有关于使用GtkFixed的注意事项,没有什么特别的地方提到没有Z顺序的概念。事实上,我只是想知道,在实现中,您必须使用什么样的现代编码实践来显示(“映射”)它的兄弟姐妹孩子之间的小部件!简单的动态列表或数组是不够的-你必须比这更弯曲!而且,展示和鼠标事件的处理方式显然不同。哇!不,我将坚持旧的编程实践,即阅读,使其尽可能简单,但不简单。这至少有100年的历史了。回到爱因斯坦,好吧,用维姆。“仅仅加载GTK+(即使在其版本2中)及其所有依赖项可能已经加载了超过1MB的数据。”liberforce表示同意。如果你想降低内存,GTK和Qt是不可取的。如果你想说“让Gtk见鬼去吧,可访问性和小屏幕用户看不到你的取消按钮的事实”,那么就完全绕过显示管理器,将它写在类似X11的东西中。