Хорошо, наконец я решил это. Вам следует создать новый тип Gtk.Window
типа POPUP
, установить для него Colormap
цветовую карту RGBA на вашем экране, сделать фон, удаленный Cairo прозрачным цветом, нарисовать на нем все, что вы хотите, и, наконец, передать его 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);