如何設定不規則視窗GTK

2021-05-24 12:26:07 字數 1690 閱讀 2742

為了體現高度的可制定性.

對於gtk來說,肯定可以實現不規則的視窗.

但是如何實現呢?

在網上找到了一些資料.主要是用透明的來實現的.

下面我們來分析一下實現的過程.

pixbuf = gdk_pixbuf_new_from_file("./1.png",null);

gdk_pixbuf_render_pixmap_and_mask(pixbuf,&pixmap,&bitmap,128);

image = gtk_image_new_from_pixbuf(pixbuf);

gtk_container_add(gtk_container(window),image);

pixmap = gdk_pixmap_new(image->window,gdk_pixbuf_get_width(pixbuf),gdk_pixbuf_get_height(pixbuf),-1);

gdk_pixbuf_render_to_drawable(pixbuf,pixmap,image->style-fg_gc[gtk_state_normal],0,0,0,0,gdk_pixbuf_get_width(pixbuf),gdk_pixbuf_get_height(pixbuf),gdk_rgb_dither_normal,0,0);

g_object_unref(pixbuf);

上面這些語句基本完成了對透明影象處理,形成不規則視窗的過程。

下面我們逐步分析。

pixbuf = gdk_pixbuf_new_from_file("./1.png",null);

建立乙個新的pixbuf通過從檔案中讀取影象。第二個引數是出錯處理的,可以不管。第乙個引數是影象檔案的名字。一般來講我們把這個檔案做成想要的形狀,不需要的地方設定成透明的,一般用ps或者gimp來處理。

gdk_pixbuf_render_pixmap_and_mask(pixbuf,&pixmap,&bitmap,128);

建立乙個pixmap和bitmap,通過第二第三個引數返回。並且設定與pixbuf相同的透明度。這個函式只是乙個轉換函式。

image = gtk_image_new_from_pixbuf(pixbuf);

通過pixbuf建立乙個image。

gtk_container_add(gtk_container(window),image);

要顯示image。

pixmap = gdk_pixmap_new(image->window,gdk_pixbuf_get_width(pixbuf),gdk_pixbuf_get_height(pixbuf),-1);

建立乙個pixmap用給出的大小和深度。

gdk_pixbuf_render_to_drawable(pixbuf,pixmap,image->style-fg_gc[gtk_state_normal],0,0,0,0,gdk_pixbuf_get_width(pixbuf),gdk_pixbuf_get_height(pixbuf),gdk_rgb_dither_normal,0,0);

這個函式應該用gdk_draw_pixbuf代替。

讓pibuf變得可繪圖。

g_object_unref(pixbuf);

減少乙個pixbuf的引用計數。

gdk_window_set_back_pixmap(image->window,pixmap,false);

設定視窗的背景。

如何建立不規則視窗

vc 中提供了crgn類和setwindowrgn函式來建立別具一格的視窗。建立乙個新視窗首先要定義乙個crgn物件,並用各種初始化函式建立crgn類的區域,然後呼叫cwnd setwindowrgn函式建立不規則視窗。crgn類是從cgdiobject類派生二來的子類,crgn類用來確定乙個多邊形...

GTK 2 0中不規則視窗的製作 上

中不規則視窗的製作 上 製作不規則 視窗的文章!當然,還是有一些的,在 freenode 的irc 上遇到了乙個中國人,bsch 他提供了一種使用圖 片製作圓形按鈕的方法,儘管他很熱心,但那並不完全符合我的需要,因為他的按鈕對事件的響應還是在乙個 矩形區域裡,而且是 gtkmm 寫的,我對 gtkm...

MFC不規則視窗

直接在onpaint 函式裡新增語句 setwindowlong m hwnd,gwl exstyle,getwindowlong m hwnd,gwl exstyle ws ex layered setlayeredwindowattributes rgb 255,255,255 0,lwa co...