GTK初次开发的经验之谈

      最近公司有写一些Linux下面的图形界面的demo的需求。所以欣然的接过这个任务,又可以以工作的名义学习新的东西,呵呵,双赢啊,双赢。

 

 

      Linux下面的一下开发,也接触过,但是写过一些命令行程序、编译个库什么的,对于GUI的程序的编写还是没有接触的。了解过GTK,知道这个是GNOME桌面环境的基础,GTK是一个开源的图像工具包。废话不多说,讲讲学习过程中的一些经验之谈吧。

 

环境搭建

 

      首先是搭建一个开发环境。看网上的介绍,GTK+是一个蛮复杂的东东,底层还有很多依赖的库,这个依赖其实和Windows下的依赖类似,就是你安装一个软件之前需要先安装的东东,但是不同的是,Linux作为一个开源的操作系统,开源精神源远流长,很多的软件或者开发包都依赖于一些比较著名的开源项目,这样使得Linux下面的很多开发可以直接使用已有的东东,而不需要从底层构建,所以开发的效率是很高的,据说。

 

      具体来讲,GTK+依赖的库有glib、atk、pango、cairo,而且这些库也有依赖,比如对libpng、freetype的依赖。可以说,GTK+的底层支持,包括图形图像、字体渲染、文本编码等等,都有其他的开源库来支持。Oh,My God~~ 这个就是开源的强大之处。

 

      一开始,我很笨,一个一个库的寻找,下载,安装,而且可能因为库的版本不对,或者安装顺序不对,或者少安装的库,GTK+的安装一直没有成功,后面好不容易成功了吧,却搞得Linux启动不了了。

 

      说一下Linux下面的这些库的安装包安装的过程,首先是把文件从压缩包里面解压出来,然后要运行一个生产make文件的命令,其实是一个叫做configure的脚本文件,会检查系统是否已经安装了他依赖的库或软件,然后会根据你的配置,就是运行configure脚本时候传递给他的参数,生产一个make文件,最一般的参数是“—prefix”,用于指明编译文件存放的位置。当生产一个make文件后,那就是调用make,开始编译吧~~~ 

 

      编译后,再运行“make install”命令,具体的工作过程不清楚,大致等于写入软件的注册信息,只是Linux下面没有注册表,都是些配置文件。

 

      OK,这样,这个软件或者库就安装好了。

 

 

 

      是有些麻烦,也很容易出错,比Windows下的安装麻烦多了。好在很多Linux发行商都发现了这个问题,所以推出一种软件安装和管理的工具,Ubuntu下面的叫做“XX软件包管理工具”,可以说,这个工具让Linux下面的软件安装比Windows下面还要方便。他会帮助你找到软件的所有依赖软件,然后全部帮你下载并安装,哈哈,连下载的工作人家都帮你做了。

 

      用软件包工具安装好GTK,就开始写吧,好像软件包管理工具还会帮你安装个IDE,叫Anjuta,也挺好用的。

 

Widget

 

      然后讲GTK+开发本身的东西。首先GTK把所有的界面元素都认为是一个widget,甚至有一些抽象不可见的widget,通过widget的排列、包含和堆叠,达到界面组织的效果。

 

      比如创建一个窗口:

GtkWidget *window = NULL;

window = gtk_window_new ( GTK_WINDOW_TOPLEVEL );

 

      然后新建一个按钮,并把它添加到窗口上:

GtkWidget *button = NULL;

gtk_button_new_with_label ( "Button Label" );

gtk_container_add (GTK_CONTAINER (window), button);

 

    然后对每个widget调用显示的方法:

gtk_widget_show ( button );

gtk_widget_show ( window );

 

     这个就是一个带有按钮的窗口。所有的widget都是创建并添加到其他的widget或窗口并最终显示出来的。

 

Widget的事件响应

 

 

 

      首先,Linux下面没有windows那样的窗口消息机制,windows下面的GUI是由和内核高度关联的,窗口消息机制也是内核支持的。Linux则不同,Linux的内核其实没有什么GUI相关的东西,因为Linux其实是一个命令行方式操作的操作系统,而GNOME / KDE类似的图形用户界面,也只是一个运行起来的应用程序而已。

 

      所以,在GTK下面,你就看不到消息这种东西的定义或是获取到消息、投递消息的函数了,取而代之的是事件回调机制。

 

      首先要做的是对某个Widget设置它关心的事件,然后为这个事件设置一个响应的函数,当时间发生的时候,GTK+就会去调用这个你传递给它的,用来响应事件的函数了。

 

      设置按钮被按下时调用响应函数(ButtonEventFunc):

g_signal_connect ( G_OBJECT (button), "clicked", G_CALLBACK (ButtonEventFunc), NULL );

 

      用于设置Widget关心的事件的函数:

void gtk_widget_set_events ( GtkWidget *widget, gint events );

 

关于图像显示的一些小经验

 

      我用GTK+写了一个打开PDF文档并显示的demo,PDF相关的东西是调用公司的库,在图像显示的过程中发现了点小问题,写出来,也许可以帮到第一次写GTK+程序的朋友。

 

      一般,我们在GTK+下面显示图形,最最常用的就是Image类型的widget,同其他的widget一样,创建后添加到其他的widget或window,然后显示。

 

      但在此之前,必须先给image widget设置图像数据。为Image widget设置图像数据有很多函数,最简单的就是从文件设置的函数:gtk_image_new_from_file。但是,如果是你自己渲染出来的位图,或是内存中的,就不能这么用了。必须用一个其他的类,来表示这个位图数据,我找了下,后来用了GtkPixbuf 这个类:

GtkPixbuf * pixbuf = NULL;

Pixbuf = gtk_image_new_from_pixbuf( (guchar*)pBuffer, GDK_COLORSPACE_RGB, TRUE, 8,

iWidth, iHeight, iStride, NULL, NULL );

 

      然后再用这个pixbuf设置Image的数据:

GtkWidget * image = NULL;

Image = gtk_image_new_from_pixbuf( pixbuf );

 

      在显示的时候,一直有点问题,由于我的位图是32位的,所以,觉得可能是函数没用对,后来就去网上搜查了一番,发现有朋友说,GtkPixpuf的功能很弱,只能支持8位的图形。得出这个结论的朋友可能是由于gtk_image_new_from_pixbuf的第四个参数的8得出的结论,但实际上,这个8是表示每个颜色样本的位数,第三个参数表示是否使用Alpha通道,所以,GtkPixbuf能够支持24位和32位的位图。另外说下,这个函数的第二和第四个函数只能是GDK_COLORSPACE_RGB和8,果然是功能不怎么强啊。

 

      一番研究后,图像显示出来了,可是颜色上有点怪异,就是偏色,蓝色和红色反了。所以怀疑是颜色样本的顺序的差异。

 

      后来手动的把每个像素点的蓝色样本和红色样本的值对调了一下,颜色才正常。不知道怎回事了。因为原来的位图数据是正常的,保存成文件都没问题,不明白为什么会出现这种颜色样本位置对换的情况,有懂的朋友可以帮我解答下,不甚感谢~~

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值