Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

GTK入门导引

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(callback_function), callback_data);

  这样分派一个按钮给一个物件, 并且提供一个指标给callback函数.

  许多物件同时也是containers. 如果您看看以下的组织图, 您会看到许多物件由GtkContainer而来 所有这一类的物件都可以用GTK_CONTAINER巨集产生使用containers.

  5.2 物件组织图

  这里是一些参考, 物件组织图.


GtkObject
+-- GtkData
|-- GtkAdjustment
|
-- GtkWidget
+-- GtkContainer
|+-- GtkBin
||+-- GtkAlignment
||+-- GtkFrame
|||*-- GtkAspectFrame
|||
||+-- GtkItem
|||+-- GtkListItem
|||+-- GtkMenuItem
||||+-- GtkCheckMenuItem
||||*-- GtkRadioMenuItem
||||
|||*-- GtkTreeItem
|||
||+-- GtkViewport
||-- GtkWindow
||+-- GtkDialog
||-- GtkFileSelection
||
|+-- GtkBox
||+-- GtkHBox
||-- GtkVBox
||+-- GtkColorSelection
||-- GtkCurve
||
|+-- GtkButton
||+-- GtkOptionMenu
||-- GtkToggleButton
||-- GtkCheckButton
||-- GtkRadioButton
||
|+-- GtkList
|+-- GtkMenuShell
||+-- GtkMenu
||-- GtkMenuBar
||
|+-- GtkNotebook
|+-- GtkScrolledWindow
|+-- GtkTable
|-- GtkTree
|
+-- GtkDrawingArea
+-- GtkEntry
+-- GtkMisc
|+-- GtkArrow
|+-- GtkImage
|+-- GtkLabel
|-- GtkPixmap
|
+-- GtkPreview
+-- GtkProgressBar
+-- GtkRange
|+-- GtkScale
||+-- GtkHScale
||-- GtkVScale
||
|-- GtkScrollbar
|+-- GtkHScrollbar
|-- GtkVScrollbar
|
+-- GtkRuler
|+-- GtkHRuler
|-- GtkVRuler
|
-- GtkSeparator
+-- GtkHSeparator
-- GtkVSeparator

  5.3 没有视窗的物件

  以下的物件跟视窗没有关系. 如果您希望接取它们的事件, 您需要使用GtkEventBox. 请见 EventBox物件


GtkAlignment
GtkArrow
GtkBin
GtkBox
GtkImage
GtkItem
GtkLabel
GtkPaned
GtkPixmap
GtkScrolledWindow
GtkSeparator
GtkTable
GtkViewport
GtkAspectFrame
GtkFrame
GtkVPaned
GtkHPaned
GtkVBox
GtkHBox
GtkVSeparator
GtkHSeparator

  再过来我们会一个一个物件来示范如何产生及显示. 一个很好的范例是testgtk.c, 您可以在gtk/testgtk.c里面找到.

  6. 按钮物件

  6.1 一般按钮

  我们到现在为止一直都看到按钮物件. 实在很简单. 有两种方法来产生按钮, 您可以用gtk_button_new_with_label() 来产生一个有标签的按钮, 或用gtk_button_new()来产生一个空按钮. 现在您可以任意操作它, 接张图(pixmap)或标签上去, 随你. 要达到这样的效果, 先产生一个box, 然後用gtk_box_pack_start 将您的objects封装进这个box. 然後用gtk_container_add来封装这个box到按钮中.

  这里是个使用gtk_button_new来产生一张有图片及标签的按钮. 我将程式分细使您在往後可以利用这个程式.


#include <gtk/gtk.h>
/* create a new hbox with an image and a label packed into it
 * and return the box.. */
GtkWidget *xpm_label_box (GtkWidget *parent, gchar *xpm_filename,
gchar *label_text)
{
GtkWidget *box1;
GtkWidget *label;
GtkWidget *pixmapwid;
GdkPixmap *pixmap;
GdkBitmap *mask;
GtkStyle *style;
/* create box for xpm and label */
box1 = gtk_hbox_new (FALSE, 0);
gtk_container_border_width (GTK_CONTAINER (box1), 2);
/* get style of button.. I assume it's to get the background color.
 * if someone knows the real reason, please enlighten me. */
style = gtk_widget_get_style(parent);
/* now on to the xpm stuff.. load xpm */
pixmap = gdk_pixmap_create_from_xpm (parent->window, &mask,
 &style->bg[GTK_STATE_NORMAL],
 xpm_filename);
pixmapwid = gtk_pixmap_new (pixmap, mask);
/* create label for button */
label = gtk_label_new (label_text);
/* pack the pixmap and label into the box */
gtk_box_pack_start (GTK_BOX (box1),
pixmapwid, FALSE, FALSE, 3);
gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 3);
gtk_widget_show(pixmapwid);
gtk_widget_show(label);
return (box1);
}
/* our usual callback function */
void callback (GtkWidget *widget, gpointer *data)
{
g_print ("Hello again - %s was pressed
", (char *) data);
}
int main (int argc, char *argv[])
{
/* GtkWidget is the storage type for widgets */
GtkWidget *window;
GtkWidget *button;
GtkWidget *box1;
gtk_init (&argc, &argv);
/* create a new window */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Pixmap'd Buttons!");
/* It's a good idea to do this for all windows. */
gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC (gtk_exit), NULL);
/* sets the border width of the window. */
gtk_container_border_width (GTK_CONTAINER (window), 10);
/* create a new button */
button = gtk_button_new ();
/* You should be getting used to seeing most of these functions by now */
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (callback), (gpointer) "cool button");
/* this calls our box creating function */
box1 = xpm_label_box(window, "info.xpm", "cool button");
/* pack and show all our widgets */
gtk_widget_show(box1);
gtk_container_add (GTK_CONTAINER (button), box1);
gtk_widget_show(button);
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (window);
/* rest in gtk_main and wait for the fun to begin! */
gtk_main ();
return 0;
}


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:GTK+/Gnome应用开发   下一篇:GTK v1.2 Tutorial(英文)

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号