异形窗口利用蒙板(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
0 Comments.