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() sul GdkPixbuf in modo da poter utilizzare Gtk.Drag.SourceSetIcon() con una mappa colore RGBA della mia Screen. 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 di SetSourceIcon()) 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))

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top