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

转载请注明:http://blog.csdn.net/hubbybob1/article/details/49248165
本文主要是针对 –GTK+2.0编程范例–宋国伟老师的书内的代码做一些注释,兼并讨论一下GTK+3.0与2.0的区别.其安装,在网上有很多讲解.

1.6带图像和快捷键的按钮
这一节是第四小结的延续,在源程序的基础上给窗口接一个背景,需要添加一个layout控件:程序如下:

/*带图像的按钮 button.c*/
#include<gtk/gtk.h>
#define  switch 1

//button 的回调函数
void on_button_clicked(GtkWidget*button,gpointer data)
{
    g_print("Button %s is pressed.\n",(gchar*)data);//当按下按钮时就会打印相应的信息
}

//创建第一个含有图片的按钮
GtkWidget* create_button1(void)
{
    GtkWidget* box;
    GtkWidget* image;//图像控件
    GtkWidget* label;
    GtkWidget* button;
    char*   title = "红苹果";

    image = gtk_image_new_from_file("apple-red.png");//创建图像控件
    label = gtk_label_new(title);//创建标签
    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);//显示盒状容器

    return button;
}

//创建第二个图片按钮
GtkWidget* create_button2(void)
{
    GtkWidget* box;
    GtkWidget* image;//图像控件
    GtkWidget* label;
    GtkWidget* button;
    char * title = "小蘑菇";

    image = gtk_image_new_from_file("gnome-gmush.png");//创建图像控件
    label = gtk_label_new(title);//创建标签
    box = gtk_hbox_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);//显示盒状容器

    return button;
}

int main(int argc,char* argv[])
{
    GtkWidget* window;
    GtkWidget* box;//容器控件
    GtkWidget* button1;
    GtkWidget* button2;
    GtkWidget* button3;
    GtkWidget* button4;
    GtkWidget *layout;//背景控件
    GtkWidget *image;//图片控件
    gchar* title = "带图像和快捷键的按钮";

//四个按钮所传输的gpointer参数
    gchar* b1 = "Red apple";
    gchar* b2 = "Small mushroom";
    gchar* b3 = "Short key";    
    gchar* b4 = "OK";

    gtk_init(&argc,&argv);

//创建window窗口,设置属性
    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),"delete_event",G_CALLBACK(gtk_main_quit),NULL);
/***************************************************************************/  
   //这部分代码是通过控件layout,建立背景,而没有使用容器控件
   //在开头定义了 switch 宏,把宏注释掉,就是原来的代码,使用容器控件
#ifdef switch

  gtk_window_set_default_size(GTK_WINDOW(window), 400, 400);//设定窗口的大小
//创建背景控件
  layout = gtk_layout_new(NULL, NULL);//创建layout控件
  gtk_container_add(GTK_CONTAINER (window), layout);//把layout绑定到窗口
 // gtk_widget_show(layout);//显示layout控件

  image = gtk_image_new_from_file("back.jpg");//加载背景图像
  gtk_layout_put(GTK_LAYOUT(layout), image, 0, 0);//把图像放到layout中去

//创建button1
    button1 = create_button1();//创建第一个图像按钮
  gtk_layout_put(GTK_LAYOUT(layout), button1, 100, 175);
    //gtk_widget_set_size_request(button1, 80, 35);
    g_signal_connect(G_OBJECT(button1),"clicked",G_CALLBACK(on_button_clicked),(gpointer)b1);//当按下识打印b1信息

//创建button2
    button2 = create_button2();
  gtk_layout_put(GTK_LAYOUT(layout), button2, 100, 100);
  //gtk_widget_set_size_request(button2, 80, 35);
    g_signal_connect(G_OBJECT(button2),"clicked",G_CALLBACK(on_button_clicked),(gpointer)b2);

//创建button3
    button3 = gtk_button_new_with_mnemonic("快捷键(_H)");//使用快捷键ALT+H,这个函数的用法是要在自目前价格下划线
  gtk_layout_put(GTK_LAYOUT(layout), button3, 175, 175);
  //gtk_widget_set_size_request(button3, 80, 35);
    g_signal_connect(G_OBJECT(button3),"clicked",G_CALLBACK(on_button_clicked),(gpointer)b3);

//创建button4
    button4 = gtk_button_new_from_stock(GTK_STOCK_OK);//使用系统自带的参数GTK_STOCK_OK,GTK_STOCK_CANCEL,GTK_STOCK_ADD等参考API说明,快捷键为ALT+O
  gtk_layout_put(GTK_LAYOUT(layout), button4, 175, 230);
  //gtk_widget_set_size_request(button4, 80, 35);
    g_signal_connect(G_OBJECT(button4),"clicked",G_CALLBACK(on_button_clicked),(gpointer)b4);

/************************************************************************************************/

/************************************************************************************************/
    //第二部分需要把第三行的宏注释掉采用的是容器控件

#else
//创建横向盒状容器,把两个图像按钮和两个普通按钮放到里面
    box = gtk_hbox_new(FALSE,0);//非均匀排放
    gtk_container_add(GTK_CONTAINER(window),box);

    button1 = create_button1();//创建第一个图像按钮
    g_signal_connect(G_OBJECT(button1),"clicked",G_CALLBACK(on_button_clicked),(gpointer)b1);//当按下识打印b1信息
    gtk_box_pack_start(GTK_BOX(box),button1,FALSE,FALSE,5);//把button1绑定到容器内

//创建第二个图像按钮,当按下识打印b2信息
    button2 = create_button2();
    g_signal_connect(G_OBJECT(button2),"clicked",G_CALLBACK(on_button_clicked),(gpointer)b2);
    gtk_box_pack_start(GTK_BOX(box),button2,FALSE,FALSE,5);

//创建第一个普通按钮,打印b3
    button3 = gtk_button_new_with_mnemonic("快捷键(_H)");//使用快捷键ALT+H,这个函数的用法是要在自目前价格下划线
    g_signal_connect(G_OBJECT(button3),"clicked",G_CALLBACK(on_button_clicked),(gpointer)b3);
    gtk_box_pack_start(GTK_BOX(box),button3,FALSE,FALSE,5);

//创建按钮,打印b4
    button4 = gtk_button_new_from_stock(GTK_STOCK_OK);//使用系统自带的参数    GTK_STOCK_OK,GTK_STOCK_CANCEL,GTK_STOCK_ADD等参考API说明,快捷键为ALT+O
    g_signal_connect(G_OBJECT(button4),"clicked",G_CALLBACK(on_button_clicked),(gpointer)b4);
    gtk_box_pack_start(GTK_BOX(box),button4,FALSE,FALSE,5);

#endif
/****************************************************************************************************/
    gtk_widget_show_all(window);    //显示
    gtk_main();
return FALSE;
}//Makefile文件如下:
CC = gcc
all:
    $(CC) -o button button.c `pkg-config --cflags --libs gtk+-3.0`

当把开关switch打开时,即”#define switch 1” 不注释掉,所使用的为layout控件,拉伸窗口时,按钮大小不会变化结果如下:
这里写图片描述
当把开关switch关闭时,即”#define switch 1” 注释掉,所采用的是box控件,拉伸窗口时,按钮大小会变化,结果如下:
这里写图片描述
虽然外表不一样,但是功能是一样的.
这里写图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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 应用程序的技巧 投稿 鸣谢 教程的版权和许可声明
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值