在GTK下设置窗口背景图片

源代码如下:

#include <gtk/gtk.h>
 
/* 功能:  设置背景图
 * widget: 主窗口
 * w, h:   图片的大小
 * path:  图片路径
 */
void chang_background(GtkWidget *widget, int w, int h, const gchar *path)
{
    gtk_widget_set_app_paintable(widget, TRUE);        //以TRUE标准,设置APP允许窗口可以绘图
    gtk_widget_realize(widget);    
 
    /* 更改背景图时,图片会重叠
     * 这时要手动调用下面的函数,让窗口绘图区域失效,产生窗口重绘制事件(即 expose 事件)。
     */
    gtk_widget_queue_draw(widget);//等待重绘制
 
    GdkPixbuf *src_pixbuf = gdk_pixbuf_new_from_file(path, NULL);    // 创建图片资源对象
    // w, h是指定图片的宽度和高度
    GdkPixbuf *dst_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR);//修改并保存获取的图片
 
    GdkPixmap *pixmap = NULL;
 
    /* 创建pixmap图像; 
     * NULL:不需要蒙版; 
     * 123: 0~255,透明到不透明
     */
    gdk_pixbuf_render_pixmap_and_mask(dst_pixbuf, &pixmap, NULL, 128);
    // 通过pixmap给widget设置一张背景图,最后一个参数必须为: FASLE
    gdk_window_set_back_pixmap(widget->window, pixmap, FALSE);
 
    // 释放资源
    g_object_unref(src_pixbuf);
    g_object_unref(dst_pixbuf);
    g_object_unref(pixmap);
}
 
int main( int argc, char *argv[])
{
    gtk_init(&argc, &argv);
 
    //主窗口操作
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 
    gtk_window_set_title(GTK_WINDOW(window), "设置窗口背景图");
    gtk_widget_set_size_request(window, 500, 450);
    
           
    chang_background(window, 500, 400, "../18DataStruct/success.jpg");    // 设置窗口背景图,特别注意图片的路径
 
    gtk_widget_show_all(window); // 显示所有部件
 
    gtk_main();
    
    return 0;
}

本程序的过程:通过参数传递图片路径->设置APP允许窗口绘图->等待重绘制发生->为窗口创建图片资源->创建的图片要经修改并保存到dst_pixbuf中->然后才能被pixmap调用实现->实现之后要释放掉图片资源

注意:当选择图片路径的时候可以选择绝对路径或相对路径

我较倾向于绝对路径!

oyx@oyx-Inspiron-5584:~/GTK$ ls
anniu    box1    entry     entry2    entry3.c  hello2    hello3.c  movies     root    table.c
anniu.c  box1.c  entry1    entry2.c  entry.c   hello2.c  hello.c   picture    root.c  window
box      box.c   entry1.c  entry3    hello1.c  hello3    menu      picture.c  table   window.c
oyx@oyx-Inspiron-5584:~/GTK$ vim picture.c
oyx@oyx-Inspiron-5584:~$ ls
 18DataStruct   classCode             home                          pp.py               test1.py        tingchechuang.c   youxi.c
 1.py           c.py                  huocheruchengchaxunxitong.c   praise.py           test2.c         tongxue           公共的
 2.py           danci.c               kaoshi.c                      -pthread            test2.py        t.py              模板
 2test1.c       dianti.c              main.c                        qq                  test3.c         tupian            视频
 a.out          dianti.h.gch          migong.c                      reusableShapes.py   test.c          tupian.c          图片
 background     drawShape.py          one.h                         shapes.py           TEST.c          turtie.py         文档
 background.c   examples.desktop      ouyangxi                      shiyan.c            testchazhao.c   tushu.c           下载
 biscuit.py    'E:课程设计1.txt'   parking.c                     sqlist.c            testc.py        vending.py        音乐
 button.py      file                  parking.h                     story.py            test.h          word.c            桌面
 chat.py        GTK                   password.py                   student             testparking.c   word.h

使用路径../18DataStruct/success.jpg即可将GTK上一级目录18DataStruct中的图片插入到GTK中的文件picture.c当中。

正是步行者,一步步登峰!

原文地址:https://www.cnblogs.com/ouyangmail/p/12616809.html