对gtk构件显示的总结

1、gtk_widget_realize的作用是,为构件(widget)创建一个gdk_window,也即是为widget创建一个xid资源


2、只有当一个widget已经被加入到顶级窗口后(top-level),才可以对 widget调用gtk_widget_realize操作,这是因为gdk_window的创建,是需要首先创建父窗口,再才创建子窗口的。因此,这是一个从root_window依序往下,创建窗口的过程。如果程序中,还没有对所有的widget连接好(确定父子关系),就擅自对其中某个widget 调用gtk_widget_realize操作,那么会导致严重的后果,因为可能导致某个widget的父窗口为null,或自身的 widget->window为null。


3、对某个widget调用gtk_widget_realize操作,这不仅仅只是自身的widget被 realized。整个的过程是,从top_level的widget开始,依次realize每个级别上的widget。也即,所有的父widget都会被realized,因为gdk_window的创建,需要父窗口先被创建出来。


4、gtk_widget_realize一般是不被外部程序所调用(虽然gtk_widget_realize是一个gtk外部接口函数),而只是被gtk内部的实现所使用。例如,它主要由gtk_widget_map所调用。


5、gtk_widget_map的作用就是显示widget,也即调用XMapWindow操作。因此,gtk_widget_map内部首先会保证widget已经被realized过了。


6、gtk_widget_map一般也只是被gtk内部的实现所使用。它由特定的widget(例如,GtkWindow)的show信号的缺省实现所调用(例如,gtk_window_show),这个信号由gtk_widget_show所触发。


7、gtk_widget_show的作用,标示widget为可以show状态,当top_level的widget接到show信号后,在它的缺省实现中,会调用gtk_widget_map来真正的显示widget。


8、gtk_widget_show_all比较复杂,但是它的作用比较简单,那就是从当前的widget开始,把所有GtkContainer类型的widget(以及child widget)都调用gtk_widget_show。


对于编写gtk应用程序时,显示widget的操作过程如下:
1、从下往上,依次gtk_widget_show每个widget,当top_level的widget被gtk_widget_show时,它会触发 gtk_widget_map每个widget,这同样也是从下往上的次序。但是,请注意!gtk_widget_map内部,会隐式地从上往下的顺序调用gtk_widget_realize


2、还有另外一种简单的方法,那就是不依次从下往上gtk_widget_show每个widget,而只是对top_level调用gtk_widget_show_all操作。这个操作,其实质上相当于从下往上,依次gtk_widget_show每个 widget。但是它的实现确实比较复杂,在这里,它通过c语言中的callback,完美无缺地实现了类似于C++中的虚函数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值