GTK 透明窗口实现

异形窗口利用蒙板(mask)实现,蒙板的数据从图片获得,每一点只有透明和不透明两种状态,不透明区域显示该窗口的背景,透明区域显示其后桌面或其它应用
gtk man 主程序

#include 

GtkWidget*    menu       = NULL;

static gboolean
on_button_press (GtkWidget*  pWidget,
         GdkEventButton* pButton,
         GdkWindowEdge   edge)
{
    if (pButton->type == GDK_BUTTON_PRESS)
    {
        if (pButton->button == 1)
            gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (pWidget)),
                            pButton->button,
                            pButton->x_root,
                            pButton->y_root,
                            pButton->time);

        if (pButton->button == 3)
            gtk_menu_popup (GTK_MENU (menu),
                    NULL,
                    NULL,
                    NULL,
                    NULL,
                    pButton->button,
                    pButton->time);
    }
}

gint close_application( GtkWidget *widget,
                        GdkEvent  *event,
                        gpointer   data )
{
    gtk_main_quit();
    return(FALSE);
}

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

    GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file (\"./window.png\",NULL);
    GtkWidget *self = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    GdkPixmap *pixmap;
    GdkBitmap *bitmap;

    gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, &bitmap, 255);
    gtk_widget_shape_combine_mask (self, bitmap, 0, 0);

    GtkStyle *style = gtk_style_copy (self->style);
    if (style->bg_pixmap[GTK_STATE_NORMAL])
      g_object_unref (style->bg_pixmap[GTK_STATE_NORMAL]);

    style->bg_pixmap[GTK_STATE_NORMAL] = g_object_ref (pixmap);

    gtk_widget_set_style (self, style);

    gtk_widget_realize (self);
    gdk_window_set_back_pixmap (self->window, NULL, FALSE);

    gtk_window_set_decorated (GTK_WINDOW (self), FALSE);
    gtk_window_set_resizable (GTK_WINDOW (self), TRUE);
    //gtk_widget_set_app_paintable (self, TRUE);

    gtk_window_move (GTK_WINDOW (self),100,100);
    gtk_widget_add_events (self, GDK_BUTTON_PRESS_MASK);
    g_signal_connect (G_OBJECT (self),\"button-press-event\",G_CALLBACK (on_button_press),NULL);

    GtkMenuItem *menuitem;
    menu = gtk_menu_new ();
    menuitem = gtk_menu_item_new_with_label  (\"quit\");
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
    gtk_widget_show (menuitem);

    g_signal_connect (G_OBJECT (menuitem),\"button-press-event\",G_CALLBACK (close_application),NULL);

    gtk_window_set_title (GTK_WINDOW (self),\"GtkTest\");
    gtk_window_set_default_size (GTK_WINDOW (self),
                     128,
                     128);

    gtk_widget_show_all (self);
    gtk_main ();

    return 0;
}

Makefile

# Make File
#
# $id: Makefile,v 1.0.0 2009/01/06 03:38:28 master Exp $
# Copyright (C) 2009 Yunlong Wen (wenyunlong@gmail.com)
#
# Last Modified: 2009/01/06 03:39:40

APPS    = main

CFLAGS  = -Wall -g -I/usr/include
LDFLAGS = -L/usr/lib  -lxmlrpc_server_abyss -lxmlrpc_server -lxmlrpc_abyss  -lpthread -lxmlrpc_server -lxmlrpc -lxmlrpc_util -lxml2 -lz -lm

all: $(APPS) 

clean:
	rm -f $(APPS)

示例下载: gtktest

Leave a comment

0 Comments.

Leave a Reply


[ Ctrl + Enter ]