Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/07/2007, à 10:43

Yvesall

GTK widget transparent

salut, j' ai un petit souci pour une appli en GTK

en faite j'ai une zone de texte du type gtk_text_view et j'aimerais mettre une image de fond, mais je ne sais pas comment faire, alors j'ai trifouiller et j'ai trouver un moyen de mettre un arriere plan sur toute la fentere de type gtk_window
mais voila le resultat :
screen01.png
et mois ce que j'aimerais c'est ca :
screen02.png
(c'est un montage fait avec gimp)

voila mon code pour le moment :

#include <gtk/gtk.h>

typedef struct  s_struct
{
    GtkWidget *pWindow;
    GtkWidget *pFrame;
    GtkWidget *pVBox;
    GtkWidget *pTable;
	GdkPixbuf *pixbuf_fond;
	GdkPixmap *pixmap_fond;
    GtkWidget *text_view;
}               t_struct;

void    place_btn(t_struct *s)
{
    GtkWidget   *scrollbar;

    s->pFrame = gtk_frame_new("Texte :");
    gtk_frame_set_shadow_type((GtkFrame *)s->pFrame, GTK_SHADOW_IN);
    s->pVBox = gtk_vbox_new(FALSE, 5);
    gtk_container_add(GTK_CONTAINER(s->pFrame), s->pVBox);

    scrollbar = gtk_scrolled_window_new(NULL, NULL);
    gtk_box_pack_start(GTK_BOX(s->pVBox), scrollbar, TRUE, TRUE, 5);

    s->text_view = gtk_text_view_new();
    gtk_container_add(GTK_CONTAINER(scrollbar), s->text_view);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollbar), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

    gtk_table_attach_defaults(GTK_TABLE(s->pTable), s->pFrame, 0, 1, 0, 1);
}

void fond_ecran_set(GtkWidget *pWindow, t_struct *s)
{
	if (s->pixmap_fond)
		gdk_window_set_back_pixmap(pWindow->window, s->pixmap_fond, FALSE);
}

gboolean fond_ecran_expose(GtkWidget *pWindow, GdkEventExpose *event, t_struct *s)
{
	if (s->pixmap_fond)
	{
		gdk_window_set_back_pixmap(pWindow->window, s->pixmap_fond, FALSE);
		return TRUE;
	}
	return FALSE;
}

int    main(int argc, char **argv)
{
    t_struct s;

	gtk_init(&argc, &argv);
	s.pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(s.pWindow), "Fenêtre principale");
	gtk_window_set_default_size(GTK_WINDOW(s.pWindow), 800, 600);
	s.pTable = gtk_table_new(1, 1, TRUE);
    gtk_container_add(GTK_CONTAINER(s.pWindow), GTK_WIDGET(s.pTable));
    place_btn(&s);

	s.pixbuf_fond = gdk_pixbuf_new_from_file_at_size("./flammes.bmp", 800, 600, NULL);
	if (s.pixbuf_fond)
	{
		s.pixmap_fond = gdk_pixmap_new(s.pWindow->window, gdk_pixbuf_get_width(s.pixbuf_fond),
                                    gdk_pixbuf_get_height(s.pixbuf_fond), gdk_visual_get_system()->depth);
		gdk_draw_pixbuf(s.pixmap_fond, s.pWindow->style->fg_gc[GTK_WIDGET_STATE(s.pWindow)], s.pixbuf_fond, 0, 0, 0, 0,
                                             gdk_pixbuf_get_width(s.pixbuf_fond), gdk_pixbuf_get_height(s.pixbuf_fond),
                                             gdk_visual_get_system()->depth, 0, 0);
		g_object_unref(s.pixbuf_fond);
	}

	g_signal_connect(G_OBJECT(s.pWindow), "realize", G_CALLBACK(fond_ecran_set), &s);
	g_signal_connect(G_OBJECT(s.pWindow), "expose-event", G_CALLBACK(fond_ecran_expose), &s);

	g_signal_connect(G_OBJECT(s.pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(G_OBJECT(s.pWindow), "delete_event", G_CALLBACK(gtk_main_quit), NULL);

	gtk_widget_show_all(s.pWindow);
	gtk_main();
	return (0);
}

donc je ne sais pas comment rendre transparent le widget text_view
merciiiii smile

Dernière modification par Yvesall (Le 26/07/2007, à 10:44)

Hors ligne

#2 Le 27/07/2007, à 09:49

Yvesall

Re : GTK widget transparent

svp ? hmm

Hors ligne

#3 Le 27/07/2007, à 11:21

Nicolas2b

Re : GTK widget transparent

essaye de dessiner le fond avec cairo ( cairographics.org), puis d'ajouter ton widget


Ubuntu Gutsy sur ASUS A6JA Q016H
2 Go de RAM
ATI X1600
Core Duo 1,8 GHz

Hors ligne