我是靠谱客的博主 寒冷金针菇,最近开发中收集的这篇文章主要介绍Gtk+的是如何用C语言实现面向对象思想的,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Gtk+的是如何用C语言实现面向对象思想的

一、gtk中创建控件的类型:

   统一都是GtkWidget *指针,而控件到底属于哪种类型,取决于创建控件的函数,在使用时根据需要做类型转换,具体能使用的类型需要在手册中搜索控件并在其对象等级中查看。
  • 下面我们用窗口类型来举例:

  •  GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    
  • 窗口控件的对象等级:

在这里插入图片描述
对象等级类似于c++中的基类和派生类,GInitiallyUnowned是GObject的派生类,GtkObject是GInitiallyUnowned的派生类,以此类推,GtkContainer是GtkWidget的派生类,而gtk+实现类似继承的方法就是定义结构体时,引用上一层类型为其成员:
在这里插入图片描述
这是gtk±2.0库中GtkContainer的结构体定义,其中GtkWidget相当于它的基类,所以是结构体的第一个成员,而在使用时,都是使用结构体指针,所以,只需要做强制类型转换就可以使用,第一个成员的地址和结构体的地址相同,剩下的其他成员,是窗口作为容器和作为普通控件的区别,作为容器多的属性数据。
所以在gtk+中各个结构体都是用此方法实现的,所以在使用gtk+来完成界面的话,经常会用到强制类型转换,而gtk+为了在封装GLIB工具库时,仿照c++把强制类型转换也重新封装了:

		gtk_container_add((GtkContainer *)window,button);

							或

		gtk_container_add(GTK_CONTAINER(window),button);

这两种方法都可以使用,实际上GTK_CONTAINER()是用(GtkContainer *)封装的带参宏,只是使用格式上更类似于c++。

二、实现回调函数

在gtk+中使用g_signal_connect来设置控件的回调函数:

		g_signal_connect(widget,signal,callback,pointer);
		
		widget:控件的地址
		signal:不同控件根据其特性拥有不同的信号,代表发生不同的事件
		callback:根据信号的不同,关于事件的信息也不同,所以可以根据信号到手册中查找赌赢回调函数的类型
		pointer:保留的参数,传给回调函数来传输事件基本信息之外的数据

而信号不同,回调函数类型不同,但是在C语言中g_signal_connect作为一个函数参数只能是一种类型,不像c++中有函数的重载,同名的函数可以有不同类型的参数形式,所以gtk+用强制类型转换的方法来完成类似功能,正常g_signal_connect函数并不是上面的使用方法,应加上一句话:

		g_signal_connect(widget,signal,G_CALLBACK(callback),pointer);

G_CALLBACK是gtk+中规定的函数指针类型(void (*g_callback)(void);),所有的函数在传参时都转成此类型,用来设置回调函数,再在真正使用此回调函数时,按照相应类型使用并传相应的参数,这是实现重载的方法。

三、总结

总的来说,Gtk+是用C语言来编写面向对象思想的程序,所以用起来有很多麻烦的地方,需要做不同的指针类型转换来实现c++中类的概念,还有一些指针的使用会麻烦一些,而且函数名都比较长,写简单的程序代码量也比较大,不过gtk的框架比较严谨,想要添加新的功能会比较方便,但是gtk并不适合大规模的项目,可以用来实现小型嵌入式设备的界面。

最后

以上就是寒冷金针菇为你收集整理的Gtk+的是如何用C语言实现面向对象思想的的全部内容,希望文章能够帮你解决Gtk+的是如何用C语言实现面向对象思想的所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(29)

评论列表共有 0 条评论

立即
投稿
返回
顶部