È possibile utilizzare le icone con RGBA trasparenza quando si utilizza GTK + drag and drop?
-
29-09-2019 - |
Domanda
Io sono nel processo di aggiunta di trascinare e rilasciare il supporto a un Mono / C # / GTK # un'applicazione esistente. Mi chiedevo se era possibile usare RGBA trasparenza sulle icone visualizzate sotto il puntatore del mouse quando iniziate a trascinare un oggetto.
Finora, mi sono reso conto quanto segue:
- posso impostare il bitmap in questione chiamando il metodo
Gtk.Drag.SourceSetIconPixbuf()
. Tuttavia, senza fortuna con alfa trasparenza:. Pixel che non sono completamente opaco otterrebbe trasparente 100% così -
Ho anche provato a chiamare
RenderPixmapAndMask()
sulGdkPixbuf
in modo da poter utilizzareGtk.Drag.SourceSetIcon()
con una mappa colore RGBA della miaScreen
. Non ha funzionato neanche: ogni volta che ho iniziato a trascinare, ho ottenuto il seguente errore:[Gdk] IA__gdk_window_set_back_pixmap: assertion 'pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap)' failed
.In questo modo, la mappa di pixel non ha nemmeno copiata, solo una forma bianca (presumibilmente impostata dall'argomento
mask
diSetSourceIcon()
) presenta sulla trascinamento.
Mi piacerebbe chiedere se c'è un modo per rendere queste icone hanno alpha di trasparenza, nonostante il fatto che non sono riuscito a farlo. Nel caso in cui è impossibile, risposte discutere le ragioni della mancanza di questa funzionalità sarebbe anche utile. Grazie.
(Compositing è - ovviamente -. Abilitata sul mio desktop (Ubuntu / 10.10, Compiz / 0.8.6-0ubuntu9))
Soluzione
Ok, ho finalmente risolto. È necessario creare un nuovo Gtk.Window
di tipo POPUP
, impostare il suo Colormap
a RGBA mappa dei colori dello schermo, ha lo sfondo cancellati dal Cairo per un colore trasparente, disegnare qualunque cosa vuoi su di esso e, infine, lo dia ad Gtk.Drag.SetIconWidget()
.
Il codice di esempio (presumibilmente ti consigliamo di utilizzare questo all'interno OnDragBegin
, o in un punto in cui si dispone di un contesto di trascinamento valida da passare a 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);