Gtk3窗口背景图片 [英] Gtk3 window background image

查看:247
本文介绍了Gtk3窗口背景图片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用C语言编写的GTK + -3.0.12(最新的稳定版本为2011年9月10日)
如何创建一个顶部窗口PNG格式的背景图像和静止地点的其他部件,如窗口上的按钮?我尝试以下,但图像绘制在按钮。

  / *
*用编译:
* GCC -Wextra -o cairo6`pkg配置--cflags --libs GTK + -3.0` cairo6.c
* /#包括LT&; GTK / gtk.h>
静态cairo_surface_t *表面= NULL;
cairo_surface_t *形象;静态gboolean
on_expose_event(* GtkWidget的部件,GdkEventExpose *事件,gpointer数据)
{
  cairo_t * CR;
  表面= gdk_window_create_similar_surface(gtk_widget_get_window(部件)
                           CAIRO_CONTENT_COLOR,
                           gtk_widget_get_allocated_width(部件)
                           gtk_widget_get_allocated_height(部件));CR = gdk_cairo_create(gtk_widget_get_window(GTK_WIDGET(部件)));
cairo_set_source_surface(CR,图像,0,0);
cairo_paint(CR);
cairo_destroy(CR);返回TRUE;
} INT主(INT ARGC,CHAR *的argv [])
{
* GtkWidget的窗口;
gtk_init(安培; ARGC,&安培; argv的);窗口= gtk_window_new(GTK_WINDOW_TOPLEVEL);
图像= cairo_image_surface_create_from_png(bdrop.png); //这里提供您自己的图像
g_signal_connect(窗口,消灭,G_CALLBACK(gtk_main_quit),NULL);
gtk_widget_set_app_paintable(窗口,FALSE);
gtk_window_set_position(GTK_WINDOW(窗口),GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(窗口),800,480);* GtkWidget的EBOX = gtk_event_box_new();
* GtkWidget的按钮;
按钮= gtk_button_new_with_label(退出);
gtk_widget_set_halign(GTK_WIDGET(按钮),GTK_ALIGN_CENTER);
gtk_widget_set_valign(GTK_WIDGET(按钮),GTK_ALIGN_CENTER);
gtk_container_add(GTK_CONTAINER(EBOX),按钮);
g_signal_connect(按钮,点击,G_CALLBACK(gtk_main_quit),NULL);gtk_container_add(GTK_CONTAINER(窗口),EBOX);
g_signal_connect(EBOX,画,G_CALLBACK(on_expose_event),NULL);gtk_widget_show_all(窗口);进入主循环();
cairo_surface_destroy(图片);
返回0;
}


解决方案

检查是否低​​于code会为你工作:

 的#include< GTK / gtk.h>INT主(INT ARGC,CHAR *的argv [])
{
    * GtkWidget的窗口;
    * GtkWidget的布局;
    * GtkWidget的形象;
    * GtkWidget的按钮;    gtk_init(安培; ARGC,&安培; argv的);    窗口= gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(窗口),290,200);
    gtk_window_set_position(GTK_WINDOW(窗口),GTK_WIN_POS_CENTER);    布局= gtk_layout_new(NULL,NULL);
    gtk_container_add(GTK_CONTAINER(窗口),布局);
    gtk_widget_show(布局);    图像= gtk_image_new_from_file(/家/ my_background_image.jpg);
    gtk_layout_put(GTK_LAYOUT(布局),图像,0,0);    按钮= gtk_button_new_with_label(按钮);
    gtk_layout_put(GTK_LAYOUT(布局),按钮150,50);
    gtk_widget_set_size_request(按钮,80,35);    函数g_signal_connect_swapped(G_OBJECT(窗口),消灭,
    G_CALLBACK(gtk_main_quit),NULL);    gtk_widget_show_all(窗口);    进入主循环();    返回0;
}

I'm using C language in gtk+-3.0.12 (latest stable version as of 9/10/2011) How can I create a png background image on a top window and still place other widgets like buttons on the window? I tried the following but the image is drawn over the button.

/*
* Compile with: 
* gcc -Wextra -o cairo6 `pkg-config --cflags --libs gtk+-3.0` cairo6.c
*/

#include <gtk/gtk.h>
static cairo_surface_t *surface = NULL;
cairo_surface_t *image;

static gboolean
on_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
  cairo_t *cr;
  surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
                           CAIRO_CONTENT_COLOR,
                           gtk_widget_get_allocated_width (widget),
                           gtk_widget_get_allocated_height (widget));

cr = gdk_cairo_create ( gtk_widget_get_window (GTK_WIDGET(widget)) );
cairo_set_source_surface (cr, image, 0, 0);
cairo_paint (cr);
cairo_destroy (cr);

return TRUE;
}

 int main(int argc, char *argv[])
{
GtkWidget *window;
gtk_init(&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
image = cairo_image_surface_create_from_png("bdrop.png"); //Supply your own image here
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_set_app_paintable(window, FALSE);
gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size (GTK_WINDOW(window), 800, 480);

GtkWidget *ebox = gtk_event_box_new ();
GtkWidget *button;
button = gtk_button_new_with_label("QUIT");
gtk_widget_set_halign (GTK_WIDGET(button),GTK_ALIGN_CENTER);
gtk_widget_set_valign (GTK_WIDGET(button),GTK_ALIGN_CENTER);
gtk_container_add (GTK_CONTAINER(ebox), button);
g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);

gtk_container_add (GTK_CONTAINER(window), ebox);
g_signal_connect(ebox,"draw", G_CALLBACK (on_expose_event),NULL);

gtk_widget_show_all (window);

gtk_main();
cairo_surface_destroy (image);
return 0;
}

解决方案

Check if code below would work for you:

#include <gtk/gtk.h>

int main( int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *layout;
    GtkWidget *image;
    GtkWidget *button;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 290, 200);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    layout = gtk_layout_new(NULL, NULL);
    gtk_container_add(GTK_CONTAINER (window), layout);
    gtk_widget_show(layout);

    image = gtk_image_new_from_file("/home/my_background_image.jpg");
    gtk_layout_put(GTK_LAYOUT(layout), image, 0, 0);

    button = gtk_button_new_with_label("Button");
    gtk_layout_put(GTK_LAYOUT(layout), button, 150, 50);
    gtk_widget_set_size_request(button, 80, 35);

    g_signal_connect_swapped(G_OBJECT(window), "destroy",
    G_CALLBACK(gtk_main_quit), NULL);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

这篇关于Gtk3窗口背景图片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆