Могу ли я использовать иконки с прозрачностью RGBA при использовании GTK + перетаскивание? - PullRequest
1 голос
/ 10 октября 2010

Я нахожусь в процессе добавления поддержки перетаскивания в существующее приложение Mono / C # / GTK #.Мне было интересно, можно ли использовать прозрачность RGBA на значках, которые появляются под указателем мыши, когда я начинаю перетаскивать объект.

До сих пор я осознал следующее:

  • Я могу установить рассматриваемое растровое изображение, вызвав метод Gtk.Drag.SourceSetIconPixbuf().Однако, не повезло с альфа-прозрачностью: пиксели, которые не являются полностью непрозрачными, таким образом стали бы прозрачными на 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.

    Таким образом, растровое изображение даже не копируется, только белая форма(предположительно установленный mask аргументом SetSourceIcon()) появляется при перетаскивании.

Я хотел бы спросить, есть ли способ сделать эти значки альфа-прозрачными, несмотря натот факт, что я не смог этого сделать.В случае, если это невозможно, ответы на вопросы о причинах отсутствия этой функции также будут полезны.Спасибо.

(Компоновка - конечно, - включена на моем рабочем столе (Ubuntu / 10.10, Compiz / 0.8.6-0ubuntu9).)

1 Ответ

0 голосов
/ 28 октября 2010

Хорошо, наконец я решил это. Вам следует создать новый тип 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);
...