GTK 透明窗口实现
异形窗口利用蒙板(mask)实现,蒙板的数据从图片获得,每一点只有透明和不透明两种状态,不透明区域显示该窗口的背景,透明区域显示其后桌面或其它应用
gtk man 主程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include <gtk /gtk.h> 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; } </gtk> |
Makefile
# Make File
#
# $id: Makefile,v 1.0.0 2009/01/06 03:38:28 master Exp $
# Copyright (C) 2009 Yunlong Wen ([email protected])
#
# 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

