#include <gtk/gtk.h>
void show_image(GtkWidget *widget,cairo_t *cr,cairo_surface_t *img)
{
cairo_region_t *mask;
cairo_set_source_surface(cr,img,0,0);
cairo_paint(cr);
mask=gdk_cairo_region_create_from_surface(img);
gtk_widget_shape_combine_region(widget,mask);
cairo_region_destroy(mask);
}
int main(int argc,char **argv)
{
GtkWidget *win;
cairo_surface_t *img;
gtk_init(&argc,&argv);
win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_decorated(GTK_WINDOW(win),FALSE);
gtk_widget_set_app_paintable(win,TRUE);
gtk_window_set_position(GTK_WINDOW(win),GTK_WIN_POS_CENTER);
img=cairo_image_surface_create_from_png("1.png");
gtk_widget_set_size_request(win,
cairo_image_surface_get_width(img),
cairo_image_surface_get_height(img));
g_signal_connect(G_OBJECT(win),"draw",
G_CALLBACK(show_image),img);
gtk_widget_show_all(win);
gtk_main();
cairo_surface_destroy(img);
return 0;
}
此程序是异形窗口
另外相关函数
cairo_region_t * cairo_region_create (void
);
Allocates a new empty region object.
Returns : | A newly allocated cairo_region_t. Free with cairo_region_destroy() . This function always returns a valid pointer; if memory cannot be allocated, then a special error object is returned where all operations on the object do nothing. You can check for this withcairo_region_status() . |
cairo_region_destroy ()
void cairo_region_destroy (cairo_region_t *region
);
Destroys a cairo_region_t object created withcairo_region_create()
,cairo_region_copy()
, oror cairo_region_create_rectangle()
.
| a cairo_region_t |
eventbox = gtk_event_box_new();
gtk_widget_shape_combine_mask(eventbox, window_shape_bitmap, 0, 0);