以下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;
}
效果图如下