1. 程式人生 > >GTK進階學習:設定視窗背景圖(可指定其大小)

GTK進階學習:設定視窗背景圖(可指定其大小)

設定視窗背景圖(可指定其大小):

#include <gtk/gtk.h>

/* 功能:  設定背景圖
 * widget: 主視窗
 * w, h:   圖片的大小
 * path:  圖片路徑
 */
void chang_background(GtkWidget *widget, int w, int h, const gchar *path)
{
	gtk_widget_set_app_paintable(widget, TRUE);		//允許視窗可以繪圖
	gtk_widget_realize(widget);	

	/* 更改背景圖時,圖片會重疊
	 * 這時要手動呼叫下面的函式,讓視窗繪圖區域失效,產生視窗重繪製事件(即 expose 事件)。
	 */
	gtk_widget_queue_draw(widget);

	GdkPixbuf *src_pixbuf = gdk_pixbuf_new_from_file(path, NULL);	// 建立圖片資源物件
	// w, h是指定圖片的寬度和高度
	GdkPixbuf *dst_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR);

	GdkPixmap *pixmap = NULL;

	/* 建立pixmap影象; 
	 * NULL:不需要蒙版; 
	 * 123: 0~255,透明到不透明
	 */
	gdk_pixbuf_render_pixmap_and_mask(dst_pixbuf, &pixmap, NULL, 128);
	// 通過pixmap給widget設定一張背景圖,最後一個引數必須為: FASLE
	gdk_window_set_back_pixmap(widget->window, pixmap, FALSE);

	// 釋放資源
	g_object_unref(src_pixbuf);
	g_object_unref(dst_pixbuf);
	g_object_unref(pixmap);
}

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

	//主視窗操作
	GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

	gtk_window_set_title(GTK_WINDOW(window), "設定視窗背景圖");
	gtk_widget_set_size_request(window, 500, 450);

	chang_background(window, 500, 400, "image.jpg");	// 設定視窗背景圖

	gtk_widget_show_all(window); // 顯示所有部件

	gtk_main();
	
	return 0;
}
程式執行效果圖如下: