第77页的gtk+编程例子——像元图

本文详细介绍了在GTK+编程中,如何处理废弃的GtkPixmap与替代的GtkImage和GdkPixbuf之间的关系。通过实例展示了如何使用GdkPixbuf修改图片尺寸并转换为可显示的GtkImage,以及不同方法下图片的加载和显示过程。
摘要由CSDN通过智能技术生成

以下gtk+编程例子是来自书籍《实用技术:开发Linux应用——用GTK+和GDK开发Linux图形用户界面应用》第77页的内容——像元图

书中的 GtkPixmap 自从gtk+2.0 就已经被弃用,被GtkImage取代了,也有一个GdkPixbuf,究竟如何关系和使用呢?

主要是参考《GTK常用控件之图片控件GtkImage》https://blog.csdn.net/tennysonsky/article/details/43057081
那篇博文已经解释得很清楚了,我直接抄袭过来添加解释就可以了,image_one和image_two都是从文件读取得来的,image_one是gtk可以直接显示,image_two是gdk可以修改尺寸但不能显示,要转化为gtk才能显示,image_three是从gtk构件读取得来的,此时是gdk,要转化为gtk才能显示,image_four就没有那么复杂,只是展示用2.png替换1.png而已

ruhong@localhost:/usr/share/icons/gnome> ls
128x128 22x22 256x256 48x48 icon-theme.cache scalable
16x16 24x24 32x32 8x8 index.theme
linux系统自带有许多图标都是放在/usr/share/icons/,到/usr/share/icons/gnome/256x256/随便复制两张图片分别改名为1.png和2.png,而且要与page77.c放在同一个文件夹

在openSUSE-Leap-15.3-DVD-x86_64的gnome3.34.7桌面环境下编译的,其中pkg-config --cflags --libs gtk±3.0两边有反引号括起来的
ruhong@localhost:~/gtk> gcc page77.c -o page77 pkg-config --cflags --libs gtk±3.0
ruhong@localhost:~/gtk> ./page77

/* the example on page 77 */
#include <gtk/gtk.h>
/* 准备材料,自定义函数  */
	/*  comments注释  */

/* 程序主体 */
int main( int argc, char *argv[] )
{
	GtkWidget *window, *hbox, *image_one, *image_two, *image_three, *image_four;
	/* 声明变量window为构件gtkwidget */
	GdkPixbuf *source;
	GdkPixbuf *destination;
	GdkPixbuf *temporarily;
	
	gtk_init (&argc, &argv);
	/* 初始化gtk */

	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	/*  创建顶级窗口 */
	gtk_window_set_title (GTK_WINDOW (window), "templet2");
	/*  为窗口顶部加上标题为templet2  */
	g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
	/*  为窗口加上动作,当收到destroy信号,就启动gtk_main_quit事件,gtk_main_quit就是鼠标单击窗口右上角的关闭按钮就终止程序  */
	gtk_container_set_border_width (GTK_CONTAINER (window), 100);
	/*  简单的理解是将窗口变成容器,可以装入其它构件,构件边缘与窗口边缘的距离为100像数  */
	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
	/* 创建横向组合框 */
	gtk_container_add (GTK_CONTAINER (window), hbox);
	/* 把横向组合框装入窗口容器 */
	
	/* 方法一:创建图片控件,这种方法创建以图片默认大小来显示,不能修改 */
	image_one =  gtk_image_new_from_file("./1.png");
	/* page77.c与1.png要在同一个文件夹,./表示在当前文件夹 */
	gtk_container_add(GTK_CONTAINER(hbox), image_one);
	/* 把图片装入横向组合框容器 */
	
	/* 方法二:下面借助GdkPixbuf来修改图片的大小,注意接口以gdk_开头,不属于控件类 */
	/* 创建pixbuf,需要占用资源,使用完,需要人为释放 */
	source= gdk_pixbuf_new_from_file("./1.png", NULL);
	/* 读取原图片1.png,source是源头的意思 */	
	destination = gdk_pixbuf_scale_simple(source, 100, 100, GDK_INTERP_BILINEAR);
	/* 修改图片大小(100, 100), 保存在destination,destination是目标的意思 */
 	image_two = gtk_image_new_from_pixbuf(destination);
        /* 通过pixbuf创建图片控件 */
	g_object_unref(source);
	g_object_unref(destination);
	/* pixbuf使用完,需要人为释放内存资源 */
	gtk_container_add(GTK_CONTAINER(hbox), image_two);
	/* 把图片装入横向组合框容器 */
	
	/* 方法三:获取图片控件里的pixbuf,以这个pixbuf又重新创建一个图片控件 */
	temporarily = gtk_image_get_pixbuf (GTK_IMAGE(image_two));
	/* 读取图片image_two,temporarily是临时的意思 */
	image_three = gtk_image_new_from_pixbuf(temporarily);
	/* 读取图片image_two,并变成image_three,其实image_two与image_three是一样,只是来源方式不一样而已 */
	gtk_container_add(GTK_CONTAINER(hbox), image_three);
	/* 把图片装入横向组合框容器 */
	
	/* 方法四:其实不能叫方法四,实际只是展示用2.png替换1.png而已 */
	image_four =  gtk_image_new_from_file("./1.png");
	source = gdk_pixbuf_new_from_file("./2.png", NULL);
	destination = gdk_pixbuf_scale_simple(source, 50, 50, GDK_INTERP_BILINEAR);
	/* 修改图片大小(100, 100), 保存在destination中 */
	gtk_image_set_from_pixbuf( GTK_IMAGE(image_four), destination );
	/* 用2.png替换1.png */
	g_object_unref(source);
	g_object_unref(destination);
	/* pixbuf使用完,需要人为释放内存资源 */
	gtk_container_add(GTK_CONTAINER(hbox), image_four);
	/* 把图片装入横向组合框容器 */

	gtk_widget_show_all (window);
	/*  显示构件窗口包括所有构件  */
	gtk_main ();
	/*  进入主循环,等待信号(鼠标键盘)输入  */
	return 0;
}

效果图如下
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值