【发布时间】:2012-02-05 06:25:09
【问题描述】:
我正在编写一个使用 GTK 库作为界面的 C 游戏。这个想法是有两个主要容器:一个用于保存按钮和其他小部件以让用户选择设置,另一个用于在实际游戏过程中显示和移动图像。我使用 VBox 来保存菜单小部件,并使用 Fixed 容器来保存游戏精灵。我在 main() 方法中有与 VBox 和 Fixed 容器相关的所有代码行:
GtkWidget* vbox;
GtkWidget* fixed;
...
int main(int argc, char** argv) {
// (The rest of this code block is in the main method)
...
// Make a vertical box for the menu widgets.
vbox = gtk_vbox_new(TRUE, 0);
// Add the menu widgets to the vbox.
gtk_box_pack_start(GTK_BOX(vbox), label1, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), button1, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), button2, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), entry, TRUE, TRUE, 0);
// Make a new fixed container, which allows its children
// widgets to be moved dynamically.
fixed = gtk_fixed_new();
// Add the game widgets to the fixed container.
gtk_fixed_put(GTK_FIXED(fixed), player1, x, y);
gtk_fixed_put(GTK_FIXED(fixed), player2, x, y + 40);
gtk_fixed_put(GTK_FIXED(fixed), ball, x + 80, y);
gtk_fixed_put(GTK_FIXED(fixed), wall, x + 120, y);
// Add the fixed container to the window.
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show(vbox);
gtk_widget_show(fixed);
在我的一个按钮操作中,我有以下操作来启动游戏:
gtk_container_remove(GTK_CONTAINER(window), vbox);
gtk_container_add(GTK_CONTAINER(window), fixed);
这没有任何问题。但是,在满足某个条件后,我调用了另一个函数,它的作用正好相反:
gtk_container_remove(GTK_CONTAINER(window), fixed);
gtk_container_add(GTK_CONTAINER(window), vbox);
这会导致以下问题:
(a.out:11762): Gtk-CRITICAL **: IA__gtk_container_add: assertion `GTK_IS_WIDGET (widget)' failed
我查看了小部件层次结构,并确认 VBox 属于 GtkWidget 类别。当我最初在 main() 方法中将 VBox 添加到窗口时,并没有出现上述错误。在调用 gtk_main() 后将此容器添加到窗口时,有什么我不知道的吗?
【问题讨论】: