转载请注明:http://blog.csdn.net/hubbybob1/article/details/49429067
本文主要是针对 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
1.7方像按钮
其程序arrow.c如下:
/*方向按钮 arrow.c */
#include <gtk/gtk.h>
#define switch //开关,两种方法的开关
//创建方向按钮
GtkWidget* create_arrow_button(GtkArrowType arrowtype,GtkShadowType shadowtype)
{
/************************************************************************/
//传统的方向按钮,定义开关switch,会执行
#ifdef switch
GtkWidget* arrow;//方向
GtkWidget* button;//按钮
button = gtk_button_new();//创建按钮
//创建箭头控件,参数为方向和阴影
//箭头的类型GtkArrorType为:GTK_ARROW_UP↑,GTK_ARROW_DOWN↓,GTK_ARROW_RIGHT→,GTK_ARROW_LEFT←
//阴影的类型GtkShadowType为:GTK_SHADOW_NONE无阴影,GTK_SHADOW_IN阴影内向,GTK_SHADOW_OUT阴影外向,
// GTK_SHADOW_ETCHED_IN,阴影向内凹进,GTK_SHADOW_IN阴影向外凸进
arrow = gtk_arrow_new(arrowtype,shadowtype);
gtk_container_add(GTK_CONTAINER(button),arrow);//arrow控件是button的一个属性
gtk_widget_show(arrow);
/************************************************************************************************/
/************************************************************************************************/
//新的方创建的方向按钮,当未定义switch时,就会执行
#else
GtkWidget* box;
GtkWidget* image;//图像控件
GtkWidget* label;
GtkWidget* button;
if( arrowtype == GTK_ARROW_UP)
image = gtk_image_new_from_file("up2.png");//创建图像控件
if( arrowtype == GTK_ARROW_DOWN)
image = gtk_image_new_from_file("down 2.png");//创建图像控件
if( arrowtype == GTK_ARROW_RIGHT)
image = gtk_image_new_from_file("right 2.png");//创建图像控件
if( arrowtype == GTK_ARROW_LEFT)
image = gtk_image_new_from_file("left2.png");//创建图像控件
box = gtk_vbox_new(FALSE,2);//创建纵向盒装容器
gtk_container_set_border_width(GTK_CONTAINER(box),5);//设置容器的的边界宽度
gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,3);//把图像控件绑定到盒装容器内
gtk_box_pack_start(GTK_BOX(box),label,FALSE,FALSE,3);//把标签控件绑定到盒状容器内
gtk_widget_show(image);//显示图片
gtk_widget_show(label);//显示标签
button = gtk_button_new();//创建按钮
gtk_container_add(GTK_CONTAINER(button),box);//把按钮放到盒装容器内
gtk_widget_show(box);//显示盒状容器
#endif
/****************************************************************************************/
return button;
}
int main( int argc,char *argv[])
{
GtkWidget* window;
GtkWidget* box;
GtkWidget* arrow1;
GtkWidget* arrow2;
GtkWidget* arrow3;
GtkWidget* arrow4;
char* title="方向按钮";
gtk_init(&argc,&argv);
//创建窗口
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),title);
gtk_container_set_border_width(GTK_CONTAINER(window),20);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
//创建横向盒状容器
box = gtk_hbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),box);
gtk_widget_show(box);
//创建左按钮
arrow1 = create_arrow_button(GTK_ARROW_LEFT,GTK_SHADOW_IN);
gtk_box_pack_start(GTK_BOX(box),arrow1,FALSE,FALSE,13);
gtk_widget_show(arrow1);
//创建上按钮
arrow2=create_arrow_button(GTK_ARROW_UP,GTK_SHADOW_IN);
gtk_box_pack_start(GTK_BOX(box),arrow2,FALSE,FALSE,13);
gtk_widget_show(arrow2);
//创建先按钮
arrow3=create_arrow_button(GTK_ARROW_DOWN,GTK_SHADOW_IN);
gtk_box_pack_start(GTK_BOX(box),arrow3,FALSE,FALSE,13);
gtk_widget_show(arrow3);
//创建右按钮
arrow4=create_arrow_button(GTK_ARROW_RIGHT,GTK_SHADOW_IN);
gtk_box_pack_start(GTK_BOX(box),arrow4,FALSE,FALSE,13);
gtk_widget_show(arrow4);
gtk_widget_show(window);
gtk_main();
return FALSE;
}
//Makefile文件
CC = gcc
all:
$(CC) -o arrow arrow.c `pkg-config --cflags --libs gtk+-3.0`
当switch被定义时,其运行结果如下:
这个方法固然好,但是显得简单多了,那么采用上一节的方法的呢,会是怎样的一个效果,那就注释掉上面代码的第三行:
“#define switch “,运行的结果如下:
方案1:
方案2:
可见这两种方案是很华丽的,如果有兴趣的话,可以按照上一节的方法,把窗口的背景改了,拿就会更华丽了:
http://blog.csdn.net/hubbybob1/article/details/49248165
下面来讲一下3.0与2.0 的区别,当把makefile中的gtk版本改为3.0时就会报警为:
就是说在3.0中建议使用gtk_box_new代替gtk_vbox_new,那么来查看一下,打开你下载的gtk3.0资源找到GtkBox.html,并打开
可以找到gtk_box_new,点进去就会看到这个函数的用法了:
进一步去看他的参数:
使用方法到此位置,有兴趣的话可以字修改一下看看.
1.8创建不同样式的标签
其函数说明文档可查看:gtk3-html-3.18.2/GtkLabel.html
其实前面已经多处使用到了标签这个控件,代码lable.c如下:
/*多种样式的标签 label.c*/
#include<gtk/gtk.h>
int main(int argc,char*argv[])
{
GtkWidget* window;
GtkWidget* box;
//定义四个标签
GtkWidget* label1;
GtkWidget* label2;
GtkWidget* label3;
GtkWidget* label4;
//定义四个框架
GtkWidget* frame1;
GtkWidget* frame2;
GtkWidget* frame3;
GtkWidget* frame4;
gchar* title;
gtk_init(&argc,&argv);
//创建窗口,带边框,标题"多样式的标签",边宽20
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"多样式的标签");
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
gtk_container_set_border_width(GTK_CONTAINER(window),20);
//创建纵向盒状容器,不均匀排列(有大有小)
box = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),box);
//创建标签一:
frame1 = gtk_frame_new("标签一");
label1 = gtk_label_new("这是第一个标签,居左的.This is the first label.");
gtk_container_add(GTK_CONTAINER(frame1),label1);
//gtk_label_set_justify:设置标签的对其方式:
//GTK_JUSTIFY_LEFT 左对齐
//GTK_JUSTIFY_RIGHT 右对齐
//GTK_JUSTIFY_CENTER 居中
//GTK_JUSTIFY_FILL 均匀分布
gtk_label_set_justify(GTK_LABEL(label1),GTK_JUSTIFY_LEFT);//左对齐
gtk_box_pack_start(GTK_BOX(box),frame1,FALSE,FALSE,5);//在box内从前到后依次排列,不扩展,不填充,与上一控件间隔为5
//创建标签二:
frame2 = gtk_frame_new("标签二");
label2 = gtk_label_new("这是第二个标签。它是多行的.\n这还是第二个标签的内容,它是居右的");
gtk_container_add(GTK_CONTAINER(frame2),label2);
gtk_label_set_justify(GTK_LABEL(label2),GTK_JUSTIFY_RIGHT);//右对齐
gtk_box_pack_start(GTK_BOX(box),frame2,FALSE,FALSE,5);
//创建标签三:
frame3 = gtk_frame_new("标签三");
label3 = gtk_label_new(NULL);
//title是格式化文本,可以设置字体的大小颜色,和字体
//开头和结尾<span 整体设置项> ***** </span >
//在整体设置中<span 整体设置项> 可以为:"<span foreground =\"red\">前景红色,"<span background =\"blue\">背景蓝色
//斜体的开头结尾 <i>*********</i>表示中间这一段是斜体,<b>******</b> 粗体
title = "<span foreground =\"red\"><big><i>这是第三个标签,\n它被格式化成红色的了,且字体也大了。</i></big></span>";
gtk_label_set_markup(GTK_LABEL(label3),title);//格式化标签文本
gtk_container_add(GTK_CONTAINER(frame3),label3);
gtk_box_pack_start(GTK_BOX(box),frame3,FALSE,FALSE,5);
//创建标签四
frame4 = gtk_frame_new("标签四");
label4 = gtk_label_new("这也是个多行标签,它的换行方式与上一个有所不同,主要是编程手段不一样,请详细查看一下源码就会明白是怎么一回事。");
gtk_container_add(GTK_CONTAINER(frame4),label4);
gtk_label_set_line_wrap(GTK_LABEL(label4),TRUE);//设置自动换行
gtk_box_pack_start(GTK_BOX(box),frame4,FALSE,FALSE,0);
gtk_widget_show_all(window);
gtk_main();
return FALSE;
}//makefile
CC = gcc
all:
$(CC) -o label label.c `pkg-config --cflags --libs gtk+-3.0`
如图所示为3.0,但要是2.0,会使怎样呢如下,自己看他们的区别吧:
1.9 Splash 窗口
其代码splash.c如下:
/*创建SPLASH窗口 splash.c */
#include<gtk/gtk.h>
int main(int argc,char* argv[])
{
GtkWidget* window;
GtkWidget* vbox;
GtkWidget* image;
GtkWidget* button;
gtk_init(&argc,&argv);
//创建创建窗口splash,为了显示LOGO,在运行时,永远处在顶层
window = gtk_window_new(GTK_WINDOW_POPUP);//无外框窗口
gtk_window_set_title(GTK_WINDOW(window),"Splash 窗口");
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
//创建Vbox
vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),vbox);
//显示LOGO
image = gtk_image_new_from_file("Lancoo.jpg");
gtk_box_pack_start(GTK_BOX(vbox),image,FALSE,FALSE,0);
button = gtk_button_new_with_label("关闭Splash窗口");
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(gtk_main_quit),NULL);
gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,0);
gtk_widget_show_all(window);
gtk_main();
return FALSE;
}//makefile
CC = gcc
all:
$(CC) -o splash splash.c `pkg-config --cflags --libs gtk+-3.0`
运行的结果如下:
到此第一章的内容就写完了