2010-10-10 29 views
1

我正在爲現有的Mono/C#/ GTK#應用程序添加拖放支持。我想知道當我開始拖動一個對象時,是否可以在出現在鼠標指針下方的圖標上使用RGBA透明度。使用GTK +拖放時,可以使用RGBA透明度的圖標嗎?

到目前爲止,我實現了以下內容:

  • 我可以通過調用Gtk.Drag.SourceSetIconPixbuf()方法設置有問題的位圖。然而,沒有運氣與alpha透明度:不完全不透明的像素會得到100%透明這種方式。
  • 我也嘗試致電GdkPixbuf上的RenderPixmapAndMask(),以便我可以使用Gtk.Drag.SourceSetIcon()以及我的Screen的RGBA色彩圖。它也沒有工作:每當我開始拖動,我得到以下錯誤:

    [Gdk] IA__gdk_window_set_back_pixmap: assertion 'pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap)' failed

    這樣,像素圖甚至不會被複制,只有一個白色的形狀(可能由mask參數SetSourceIcon()設置)顯示在拖動中。

我想,詢問是否有辦法讓這些圖標的Alpha透明度儘管我沒有這樣做的事實。如果不可能,那麼討論缺乏這個功能的原因也是有幫助的。謝謝。

(合成是 - 當然 - 我的桌面(Ubuntu的/ 10.10的Compiz/0.8.6-0ubuntu9)上啓用)

回答

0

好吧,我終於解決了這個問題。您應該創建一個新的Gtk.WindowPOPUP類型,將其Colormap設置爲您的屏幕的RGBA色彩映射表,將背景由開羅擦除爲透明色,然後繪製您想要的任何內容並最終將其傳遞至Gtk.Drag.SetIconWidget()

示例代碼(想必你會想,你有一個有效的阻力情況下被傳遞到SetIconWidget()使用這裏面OnDragBegin,或在某點):

Gtk.Window window = new Gtk.Window (Gtk.WindowType.Popup); 

window.Colormap = window.Screen.RgbaColormap; 
window.AppPaintable = true; 
window.Decorated = false; 
window.Resize (/* specify width, height */); 

/* The cairo context can only be created when the window is being drawn by the 
* window manager, so wrap drawing code into an ExposeEvent delegate. */ 
window.ExposeEvent += delegate { 

    Context ctx = Gdk.CairoHelper.Create (window.GdkWindow); 

    /* Erase the background */ 
    ctx.SetSourceRGBA (0, 0, 0, 0); 
    ctx.Operator = Operator.Source; 
    ctx.Paint(); 

    /* Draw whatever you'd like to here, and then clean up by calling 
     Dispose() on the context's target. */ 

    (ctx.Target as IDisposable).Dispose(); 
}; 

Gtk.Drag.SetIconWidget(drag_context, window, 10, 10); 
相關問題