使用GTK+拖放时,我可以使用具有RGBA透明度的图标吗?
-
29-09-2019 - |
题
我正在为现有的单声道/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.Window
的 POPUP
类型,设置其 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);