转载请注明:http://blog.csdn.net/hubbybob1/article/details/50034387
本文主要是针对 GTK+2.0编程范例–宋国伟老师的书内的代码做一些注释,兼并讨论一下GTK+3.0与2.0的区别.其安装,在网上有很多讲解.
查看各个函数的的说明,就得看说明文档,下面这个网址很好,是GTK+3.0API的目录:
https://developer.gnome.org/gtk3/stable/
或者下载我上传的3.0说明文档,查看:
http://download.csdn.net/detail/hubbybob1/9219553
2.3创建工具条
代码toolbar.c如下所示:
//toolbar.c
#include <gtk/gtk.h>
void on_button_clicked(GtkButton* button,gpointer data)
{
g_print("你点击的按钮是 %s \n",(gchar*)data);
}
int main(int argc, char* argv[])
{
GtkWidget* window;
GtkWidget* box;
GtkWidget* toolbar;
GtkWidget* entry;
GtkWidget* lable;//定义菜单条
gtk_init(&argc,&argv);
//window
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"添加工具条");
gtk_container_set_border_width(GTK_CONTAINER(window),20);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
//box
box = gtk_vbox_new(FALSE,0);//非均匀排放
gtk_container_add(GTK_CONTAINER(window),box);
//toolbar
toolbar = gtk_toolbar_new();
gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar), //工具条 参考注释1
GTK_STOCK_NEW, //新建图标的系统固有资源
"新建一个文件","新建", //提示信息
GTK_SIGNAL_FUNC(on_button_clicked), //回调函数
(gpointer)("新建"),-1); //回调参数, 插入按钮的位置 -1:表示最后,NULL:依次
gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),
GTK_STOCK_OPEN, //打开图标
"打开一个文件","打开",
GTK_SIGNAL_FUNC(on_button_clicked),
(gpointer)("打开"),-1);
gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),
GTK_STOCK_SAVE, //保存图标
"保存当前文件","保存",
GTK_SIGNAL_FUNC(on_button_clicked),
(gpointer)("保存"),-1);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));//在工具条内添加竖线间隔
//lable
lable = gtk_label_new(" 文件名:");
gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar),lable,"这是一个标签","标签");//添加自己创建你的控件
//entry
entry = gtk_entry_new();
gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar),entry,"这是一个录入条","录入");
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),
GTK_STOCK_CUT,
"剪切","剪切",
GTK_SIGNAL_FUNC(on_button_clicked),
(gpointer)("剪切"),-1);
gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),
GTK_STOCK_COPY,
"复制","复制",
GTK_SIGNAL_FUNC(on_button_clicked),
(gpointer)("复制"),-1);
gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),
GTK_STOCK_PASTE,
"粘贴","粘贴",
GTK_SIGNAL_FUNC(on_button_clicked),
(gpointer)("粘贴"),-1);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar),
GTK_STOCK_QUIT,
"退出","退出",
GTK_SIGNAL_FUNC(on_button_clicked),
(gpointer)("退出"),-1);
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),GTK_TOOLBAR_ICONS);//设定工具条的外观,参考注释2
gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),GTK_ICON_SIZE_SMALL_TOOLBAR);//设定工具图标的大小,参考注释3
gtk_box_pack_start(GTK_BOX(box),toolbar,FALSE,FALSE,0);
gtk_widget_show_all(window);
gtk_main();
return FALSE;
}
//1.最关键的函数是gtk_toolbar_insert_stock, 向工具条内插入库固有资源,
//也就是第2个参数,
/*2.gtk_toolbar_set_style 设定工具条的外观
GTK_TOOLBAR_ICONS 只显示图标
GTK_TOOLBAR_TEXT 只显示文字
GTK_TOOLBAR_BOTH 两个都显示,竖直显示
GTK_TOOLBAR_BOTH_HORIZ 图标与文字并排显示
*/
//3.gtk_toolbar_set_icon_size设定大小的参数如下:
/*enum GtkIconSize
GTK_ICON_SIZE_INVALID Invalid size.
GTK_ICON_SIZE_MENU Size appropriate for menus (16px).
GTK_ICON_SIZE_SMALL_TOOLBAR Size appropriate for small toolbars (16px).
GTK_ICON_SIZE_LARGE_TOOLBAR Size appropriate for large toolbars (24px)
GTK_ICON_SIZE_BUTTON Size appropriate for buttons (16px)
GTK_ICON_SIZE_DND Size appropriate for drag and drop (32px)
GTK_ICON_SIZE_DIALOG Size appropriate for dialogs (48px)
*/
makefile文件
CC=gcc
all:
$(CC) -o toolbar toolbar.c `pkg-config --cflags --libs gtk+-2.0`
运行的结果如下:
当点击时的打印信息如下:
这是2.0的结果,如果使用3.0编译就会出错:
因此对于gtk3的代码主要变化是gtk_toolbar_insert取代gtk_toolbar_insert_stock,代码写辑更加简单了,使g_signal_connect来产生回调函数
//toolbar1.c
#include <gtk/gtk.h>
int main( int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *toolbar;
GtkToolItem *new;
GtkToolItem *open;
GtkToolItem *save;
GtkToolItem *sep;
GtkToolItem *exit;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 250, 200);
gtk_window_set_title(GTK_WINDOW(window), "toolbar");
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
toolbar = gtk_toolbar_new();
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
gtk_container_set_border_width(GTK_CONTAINER(toolbar), 2);
new = gtk_tool_button_new_from_stock(GTK_STOCK_NEW);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), new, -1);
open = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), open, -1);
save = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), save, -1);
sep = gtk_separator_tool_item_new();
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep, -1);
exit = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), exit, -1);
gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 5);
g_signal_connect(G_OBJECT(exit), "clicked", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}//编译代码
gcc -o toolbar1 toolbar1.c `pkg-config --cflags --libs gtk+-3.0`
运行的结果:
系统图标有很多,主要在gtk3-Stock-Items.html内会有定义,下面列出了一些