用gtk_widget_show()显示构件,立刻就能显示出来么?

来源:百度知道 编辑:UC知道 时间:2024/09/21 19:47:38
gtk是事件驱动的,我想问的问题是,用gtk_widget_show()显示构件的时候是不是也有一个GTK内在的信号传递机制?也就是说gtk_widget_show()会触发一个GTK专有的信号,GTK进程监测到这个信号后才会显示相应的构件?

哦,还不能够确保一定能够显示,如果你看过源代码,它是引发了一个show信号,如果它的派生构件没有覆盖show这个信号的方法,会调用默认的gtk_widget_real_show方法。

在gtk中,一个构件的显示要经过两个必要的步骤:
1.realize
2.map

realize是创建对应的gdk窗口,同时也会创建对应的x窗口
而map则是调用gdk_window_show()把已经创建的gdk窗口在屏幕上显示出来,使窗口变得可见。

如果它的派生构件没有覆盖show这个信号的方法,gtk_widget_show()引发信号然后调用默认的gtk_widget_real_show

而gtk_widget_real_show这个方法又会调用gtk_widget_map(), gtk_widget_map先检查构件的gdk窗口有没有realize,如果没有,则先realize这个窗口,然后才调用gdk_window_show使的窗口可见。

窗口可见的话,就可以在上面进行各种绘制了。

要窗口马上显示出来,要用gtk_widget_show_now,它会添加一个回调函数来捕获map_event,如果没有捕获该事件,它会一直调用主循环迭代来强制等待该事件信号