Linux GTK+ 透明 不规则 按钮 Glade3

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include <glade/glade.h>

void
close_button_clicked (GtkWidget *widget, gpointer user_data)
{
  printf ("Quit now!./n");
  gtk_main_quit ();
}
gint mouse_event_handle(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
 GdkPixbuf *pixbuf;
 GdkPixmap *pixmap;
 GdkBitmap *bitmap;
 GtkWidget *oldImage;
 GtkWidget *newImage;
 switch(event->type){
    case GDK_BUTTON_PRESS:
        printf("GDK_BUTTON_PRESS/n");
        break;
    case GDK_BUTTON_RELEASE:
        printf("GDK_BUTTON_RELEASE/n");
        break;     
    case  GDK_ENTER_NOTIFY:
        printf("GDK_ENTER_NOTIFY/n");
        oldImage = GTK_WIDGET(gtk_container_children(GTK_CONTAINER(widget))->data);
        gtk_object_ref(GTK_OBJECT(oldImage));
        gtk_container_remove(GTK_CONTAINER(widget), oldImage);
        pixbuf = gdk_pixbuf_new_from_file ("/home/Jung/GTKTEST/src/A00.png", NULL);
        newImage = gtk_image_new_from_pixbuf (pixbuf);
        gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, &bitmap, 128);
        gtk_widget_shape_combine_mask(widget, bitmap, 0, 0);
        gtk_container_add(GTK_CONTAINER(widget), newImage);
        gtk_widget_show(newImage);
        break;     
    case GDK_LEAVE_NOTIFY:
        printf("GDK_LEAVE_NOTIFY/n");
        oldImage = GTK_WIDGET(gtk_container_children(GTK_CONTAINER(widget))->data);
        gtk_object_ref(GTK_OBJECT(oldImage));
        gtk_container_remove(GTK_CONTAINER(widget), oldImage);
        pixbuf = gdk_pixbuf_new_from_file ("/home/Jung/GTKTEST/src/A.png", NULL);
        newImage = gtk_image_new_from_pixbuf (pixbuf);
        gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, &bitmap, 128);
        gtk_widget_shape_combine_mask(widget, bitmap, 0, 0);
        gtk_container_add(GTK_CONTAINER(widget), newImage);
        gtk_widget_show(newImage);
        break;
    default:
        printf("unknow/n");
        break;
 }
return 0;
}

int main(int argc, char *argv[])

{

    GladeXML *main_window = NULL;

    GtkWidget *fixed = NULL;

    GdkPixbuf *pixbuf = NULL;

    GdkPixmap *pixmap = NULL;

   GtkWidget *widget;

   GtkWidget *window;

    GtkWidget *eventbox;

    GtkWidget *image;

    GdkBitmap *bitmap;

 

    gtk_init(&argc,&argv);

 

    // Create the window 

  // load the interface
    main_window = glade_xml_new ("/home/Jung/GTKTEST/src/test.glade", NULL, NULL);
    glade_xml_signal_autoconnect(main_window);
    //load background
    pixbuf = gdk_pixbuf_new_from_file ("/home/Jung/GTKTEST/src/RainDrops.jpg",NULL);
    image = gtk_image_new_from_pixbuf (pixbuf);

    window = glade_xml_get_widget (main_window, "Main_Window");
    gtk_widget_set_app_paintable(window,TRUE);
    gtk_widget_realize (window);
    gtk_widget_set_size_request(window, gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf));
    pixmap = gdk_pixmap_new (window->window, gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), -1);
    gdk_pixbuf_render_to_drawable(pixbuf, pixmap,
                window->style->fg_gc[GTK_STATE_NORMAL],
                0,0,0,0,
                gdk_pixbuf_get_width(pixbuf),
                gdk_pixbuf_get_height(pixbuf),
                GDK_RGB_DITHER_NORMAL,0,0);
    g_object_unref(pixbuf);
    gdk_window_set_back_pixmap (window->window, pixmap, FALSE);
    widget = glade_xml_get_widget (main_window, "btn_close");
    g_signal_connect (G_OBJECT (widget), "clicked",
                    G_CALLBACK (close_button_clicked), NULL);

 

      // Load button

    eventbox = glade_xml_get_widget (main_window, "eventbox1");
    pixbuf = gdk_pixbuf_new_from_file ("/home/Jung/GTKTEST/src/A.png",NULL);

    image = gtk_image_new_from_pixbuf (pixbuf);

   gtk_widget_set_size_request(eventbox, gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf));
   gtk_container_add(GTK_CONTAINER(eventbox), image);

    //  Set button mask

    gdk_pixbuf_render_pixmap_and_mask(pixbuf, NULL, &bitmap, 255);

    gtk_widget_shape_combine_mask(eventbox, bitmap, 0, 0);

   gtk_widget_set_events(eventbox, GDK_MOTION_NOTIFY | GDK_BUTTON_PRESS | GDK_BUTTON_RELEASE
   | GDK_ENTER_NOTIFY | GDK_LEAVE_NOTIFY);
 
    g_signal_connect(G_OBJECT(eventbox), "button_press_event", GTK_SIGNAL_FUNC(mouse_event_handle), NULL);
    g_signal_connect(G_OBJECT(eventbox), "button_release_event", GTK_SIGNAL_FUNC(mouse_event_handle), NULL);
    g_signal_connect(G_OBJECT(eventbox), "enter_notify_event", GTK_SIGNAL_FUNC(mouse_event_handle), NULL);
    g_signal_connect(G_OBJECT(eventbox), "leave_notify_event", GTK_SIGNAL_FUNC(mouse_event_handle), NULL);

    g_signal_connect (G_OBJECT (glade_xml_get_widget (main_window, "Main_Window")), "delete_event",
                    G_CALLBACK (gtk_main_quit), NULL);
    gtk_widget_show_all(glade_xml_get_widget (main_window, "Main_Window"));

    gtk_main();

   return 0;

}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值