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

本文详细解释了GTK+2.0编程范例,包括方向按钮和标签控件的实现,并讨论了GTK+3.0与GTK+2.0之间的主要区别。文章提供了GTK+3.0API目录链接和Makefile文件示例,展示了两种不同的按钮创建方法,以及如何使用GTK+3.0改进窗口背景和创建不同样式的标签。同时,对比了GTK+3.0与GTK+2.0在API和功能上的变化。

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

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

GTK+ 2.0 教程 译者: huzheng,konghui,ferry,carton,yang_yi,ddd,tingle 版本号: V_0.1.0 2002年 6 月25 日 本文是有关通过 C 语言接口使用 GTK (the GIMP Toolkit) 的教程。 Table of Contents 中文版说明 简介 从这里开始 用 GTK 来写 Hello World 编译 Hello World 程序 信号和回调函数的原理 事件 Hello World 详解 继续 数据类型 深入探索信号处理函数 改进了的 Hello World 组装构件 组装盒的原理 盒的细节 组装示范程序 用表组装 表组装示例 构件概述 类型转换 构件的组织 无窗口构件 按钮构件 一般按钮 Normal Buttons 开关按钮 Toggle Buttons 复选按钮 Check Buttons 单选按钮 Radio Buttons 调整对象 Adjustments 创建一个调整对象 轻松使用调整对象 “调整对象”的内部机制 范围构件 Range Widgets 滚动条构件 Scrollbar Widgets 比例构件 Scale Widgets 创建一个比例构件 函数和信号(至少讲了函数) 常用的范围函数 设置更新方式 获得和设置调整对象 键盘和鼠标绑定 示例 杂项构件 标签 Labels 箭头 Arrows 工具提示对象 The Tooltips Object 进度条 Progress Bars 对话框 Dialogs 标尺 Rulers 状态栏 Statusbars 文本输入构件 Text Entries 微调按钮 Spin Buttons 组合框 Combo Box 日历 Calendar 颜色选择 Color Selection 文件选择 File Selections 容器构件 Container Widgets 事件盒 The EventBox 对齐构件 The Alignment widget 固定容器 Fixed Container 布局容器 Layout Container 框架 Frames 比例框架 Aspect Frames 分栏窗口构件 Paned Window Widgets 视角 Viewports 滚动窗口 Scrolled Windows 按钮盒 Button Boxes 工具栏 Toolbar 笔记本 Notebooks 菜单构件 手工创建菜单 手工菜单示例 使用套件 套件示例 无文档构件 快捷标签 Accel Label 选项菜单 Option Menu 菜单项 Menu Items 复选菜单项 Check Menu Item 单选菜单项 Radio Menu Item 分隔菜单项 Separator Menu Item 分离菜单项 Tearoff Menu Item 曲线图 Curves 绘图区 Drawing Area 字体选择对话框 Font Selection Dialog 消息对话框 Message Dialog Gamma 曲线图 图像 Image 插头和插座 Plugs and Sockets 树视区 Tree View 文本视区 Text View 设置构件的属性 超时、IO 和 Idle 函数 超时 Timeouts 监控IO Idle 函数 高级事件和信号处理 信号函数 连接和断开信号处理函数 阻塞和反阻塞信号处理函数 发出和停止信号 信号的发射和传播 操作选中区 概述 获取选中区信息 提供选中区 拖放 概述 属性 函数 设置源构件 源构件上的信号 设置目的构件 目的构件上的信号 GLib 定义 双向链表 单向链表 存储管理 计时器 字符串处理 实用程序和错误处理函数 GTK 的 rc 文件 rc 文件的功能 GTK rc 文件的格式 rc 文件示例 编写你自己的构件 概述 一个构件的剖析 创建一个复合构件 介绍 选择一个父类 头文件 _get_type() 函数 _class_init() 函数 _init() 函数 其余的... 从头创建构件 介绍 在屏幕上显示构件 表盘构件的原形 主体 gtk_dial_realize() 大小磋商 gtk_dial_expose() 事件处理 可能的增强 深入的学习 涂鸦板,一个简单的绘图程序 概述 事件处理 绘图区构件和绘图 添加XInput支持 允许扩展设备信息 使用扩展设备信息 得到更多关于设备的信息 进一步的讲解 编写 GTK 应用程序的技巧 投稿 鸣谢 教程的版权和许可声明
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值