Question

Je suis en train d'ajouter glisser et déposez le soutien à un existant Mono / C # / GTK application #. Je me demandais s'il était possible d'utiliser la transparence RGBA sur les icônes qui apparaissent sous le pointeur de la souris quand je commence à faire glisser un objet.

Jusqu'à présent, je réalise ce qui suit:

  • je peux définir le bitmap en question en appelant la méthode Gtk.Drag.SourceSetIconPixbuf(). Cependant, pas de chance avec transparence alpha. Pixels qui ne sont pas complètement opaque obtiendrait cette manière transparente 100%
  • J'ai aussi essayé d'appeler RenderPixmapAndMask() sur le GdkPixbuf pour que je puisse utiliser Gtk.Drag.SourceSetIcon() avec une palette de couleurs RGBA de mon Screen. Il ne fonctionne pas non plus: chaque fois que je commencé à glisser, je suis l'erreur suivante:

    [Gdk] IA__gdk_window_set_back_pixmap: assertion 'pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap)' failed.

    De cette façon, le pixmap ne soit copié même pas, seule une forme blanche (probablement fixé par l'argument mask de SetSourceIcon()) apparaît sur le déplacement.

Je voudrais demander s'il y a un moyen de rendre ces icônes ont la transparence alpha, en dépit du fait que j'omis de le faire. Dans le cas où il est impossible, les réponses discuter des raisons de l'absence de cette fonctionnalité serait également utile. Merci.

(Compositing est - bien sûr -. Activé sur mon bureau (Ubuntu / 10.10, Compiz / 0.8.6-0ubuntu9))

Était-ce utile?

La solution

Ok, enfin je l'ai résolu. Vous devez créer une nouvelle Gtk.Window de type POPUP, définissez son Colormap à RGBA la palette de couleurs de votre écran, ont l'arrière-plan effacée par Le Caire à une couleur transparente, dessiner ce que vous voulez sur elle et passer enfin à Gtk.Drag.SetIconWidget().

Exemple de code (probablement vous aurez envie d'utiliser cet intérieur OnDragBegin ou à un point où vous avez un contexte de traînée valide à passer à 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top