為了體現高度的可制定性.
對於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...