我正在为现有的单声道/C#/GTK#应用程序添加阻力支持。我想知道,当我开始拖动对象时,是否可以在鼠标指针下出现的图标上使用RGBA透明度。

到目前为止,我意识到以下内容:

  • 我可以通过调用 Gtk.Drag.SourceSetIconPixbuf() 方法。但是,Alpha透明度没有运气:不完全不透明的像素会以这种方式获得100%透明的。
  • 我也尝试打电话 RenderPixmapAndMask()GdkPixbuf 这样我就可以使用 Gtk.Drag.SourceSetIcon() 带着我的RGBA结肠 Screen. 。它也没有起作用:每当我开始拖动时,我都会收到以下错误:

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

    这样,PixMap甚至没有复制,只有白色形状(大概是由 mask 争论 SetSourceIcon())出现在拖动上。

我想问一下是否有一种方法可以使这些图标具有alpha透明度,尽管我没有这样做。如果这是不可能的,答案讨论缺乏此功能的原因也将有所帮助。谢谢你。

(当然,合成是在我的桌面上启用的(ubuntu/10.10,compiz/0.8.6-0ubuntu9)。)。

有帮助吗?

解决方案

好的,终于我解决了。您应该创建一个新的 Gtk.WindowPOPUP 类型,设置其 Colormap 在您屏幕的RGBA Colormap上,将开罗擦除的背景删除为透明的颜色,绘制您想要的任何内容,最后将其传递给 Gtk.Drag.SetIconWidget().

示例代码(大概您要在内部使用此代码 OnDragBegin, ,或者在您具有有效的阻力上下文中 SetIconWidget()):

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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top