GTK+2.0编程范例代码分析-第一章(3)

转载请注明: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`

运行的结果如下:
这里写图片描述
到此第一章的内容就写完了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值