Linux操作系统因代码的开放性而为编程开发人员所青睐,TurboLinux内集成的图形用户界面开发工具glade也日益受到编程人员的欢迎,它是基于自由软件库GIMP工具包GTK+(GIMP
Tool
kit)、GDK(GIMP绘图包)的一种开发工具。笔者在所研究的课题中就使用了此开发工具中的GTK+。
GTK+中包含了许多构件,笔者在编程过程中对其中的CLIST列表构件使用频率较高,总结出了使用该构件的几点认识,可供使用glade的编程者参考和借鉴。
一、CLIST列表构件的特点
CLIST列表构件是一种行列线不可见的表格,在结构上类似于通用数据库中的二维数据表。它能容纳从数据库中获得或从程序中获得的大量数据,操作非常方便、简洁。
二、CLIST列表构件函数的获取
CLIST列表构件提供了丰富的操作函数。这些函数一方面从GTK+/GDK参考书或相关网站中获得,另一方面就是从TurboLinux操作系统的/usr/include/gtk目录中找到CLIST列表构件的头文件gtkclist.h,其中就包含了构件的宏定义、相关结构、回调函数信号和基于C语言的专用函数。
函数虽多,但函数并不是孤立的,相互之间存在着意义或功能上的联系。掌握了函数之间的联系,使用起来就会得心应手。
三、CLIST列表构件常用函数的使用
在gtkclist.h中的函数仅给出了原型声明,即函数名、参数和函数返回类型,对函数的使用没有作出具体说明。在此,笔者想谈谈编程中使用较多的几个函数的用法技巧。
gtkclist.h中的函数虽多,但各函数原型声明中第一个参数类型都相同,返回的都是指向GtkCList构件的指针。函数多样性由其它参数来决定。
1、数据添加函数
gint
gtk_clist_append (GtkCList *clist,gchar
*text[]);
该函数是对CLIST列表构件进行从无到有的填充数据,添加方向是从上至下,返回数据在CLIST列表构件中的索引行,即添加的数据行在构件中的行号。注意行号从0而非1开始。该函数使得在构件中添加或修改一行数据很方便;
另一个与该函数功能相同的是gtk_clist_prepend函数,只不过构件中数据的添加方向是从下至上。函数原型声明为:
gint
gtk_clist_prepend (GtkCList *clist,gchar
*text[]);
此外,还有gtk_clist_insert函数,该函数是在指定的索引行前添加一行数据并返回插入后的实际索引行号。原型声明为:
gint
gtk_clist_insert (GtkCList *clist,gint row,gchar
*text[]);
这三个函数的末参数在不直接赋值的前提下,通常与一组录入构件结合使用。
2、数据删除函数
void
gtk_clist_remove (GtkCList *clist,gint
row);
该函数用来删除某一索引行。行数确定时,直接对应第二个参数即可。但当行数不确定,而是由鼠标或盘随机获得的焦点行,又怎样删除呢?这样一个动态变行删除问题,在具体编程实现上,我通过利用CLIST列表构件头文件gtkclist.h内GtkCList结构中的属性变量focus_row,简单地实现了该功能,实现语句如下:
gtk_clist_remove
(GTK_CLIST(clist),GTK_CLIST
(clist)->focus_row);
用来删除一行的数据函数有了,那么如何一次性删除整个列表构件中的行列单元值?可用构件中提供的gtk_clist_clear函数。原型如下:
void
gtk_clist_clear (GtkCList
*clist);
该函数的优点在于参数简单,数据删除彻底,删除效率高。
3、从构件中修改/读取数据函数
void
gtk_clist_set_text (GtkCList *clist,gint row, gint column,const gchar
*text);
该函数是用一个给定的行列对应单元值来代替现存的内容以完成对CLIST列表构件中对应行列单元值的修改,这与gtk_clist_append函数不同。前者是对CLIST构件中现存的数据进行更新,而后者是产生一个从无到有的新数据。
gint gtk_clist_get_text (GtkCList *clist, gint row,gint column,gchar
**text);
该函数是读取CLIST列表构件中行列单元值,它与gtk_clist_set_text函数功能相反。且要注意到二者末参数不同,前者第二个参数是指向字符串的指针,后者则是指向字符串指针的指针。
值得注意的是,CLIST列表构件行列单元值可以是一般数据,也可用像素图pixmap和像素图文本pixtext作为数据,相应的函数原型是:
void
gtk_clist_set_pixmap (GtkCList *clist, gint row,gint column,GdkPixmap
*pixmap,GdkBitmap *mask);
gint gtk_clist_get_pixmap (GtkCList
*clist,gint row,gint column, GdkPixmap **pixmap,GdkBitmap
**mask);
void gtk_clist_set_pixtext (GtkCList *clist,gint row,gint
column,const gchar *text,guint8 spacing,
GdkPixmap *pixmap,GdkBitmap
*mask);
gint gtk_clist_get_pixtext (GtkCList *clist,gint row,gint
column,gchar **text,guint8 *spacing,GdkPixmap **pixmap,GdkBitmap
**mask);
4、提高数据添加/修改效率函数
为了加快CLIST列表构件中所有可视数据更新的效率,在大量数据添加/修改中笔者运用了一对功能相反的冻结/解冻函数。
void
gtk_clist_freeze (GtkCList *clist);
void gtk_clist_thaw (GtkCList
*clist);
注意这两个函数必须成对使用,先用gtk_clist_freeze冻结函数,写完添加/修改数据语句后,再使用gtk_clist_thaw解冻函数。
以上是笔者在编程过程中使用CLIST列表构件及其中常用函数的几点体会,当然随着编程的深入,该构件其它函数的的使用也会日渐增多,技巧也会越来越多。
标签:
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com