2010-10-10 44 views
1

Je suis en train d'ajouter le support glisser-déposer à une application Mono/C#/GTK # existante. Je me demandais s'il était possible d'utiliser la transparence RGBA sur les icônes qui apparaissent sous le pointeur de la souris lorsque je commence à faire glisser un objet.Puis-je utiliser des icônes avec transparence RVBA lors de l'utilisation de GTK + glisser-déposer?

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

  • je peux régler le bitmap en question en appelant la méthode Gtk.Drag.SourceSetIconPixbuf(). Cependant, pas de chance avec la transparence alpha: les pixels qui ne sont pas complètement opaques seraient 100% transparents de cette façon.
  • J'ai également essayé d'appeler RenderPixmapAndMask() sur le GdkPixbuf afin que je puisse utiliser Gtk.Drag.SourceSetIcon() avec une carte de couleurs RGBA de mon Screen. Cela n'a pas fonctionné non plus: chaque fois que j'ai commencé à faire glisser, j'ai 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 n'est même pas copié, seule une forme blanche (vraisemblablement définie par l'argument mask de SetSourceIcon()) apparaît lors du glissement.

Je voudrais demander s'il existe un moyen de rendre ces icônes alpha-transparentes, malgré le fait que je n'ai pas réussi à le faire. Dans le cas contraire, les réponses aux raisons de l'absence de cette fonctionnalité seraient également utiles. Je vous remercie.

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

Répondre

0

Ok, enfin je l'ai résolu. Vous devez créer un nouveau type Gtk.Window de POPUP, définir son Colormap sur la palette de couleurs RGBA de votre écran, l'arrière-plan effacé par Cairo dans une couleur transparente, dessiner ce que vous voulez dessus et enfin le passer à Gtk.Drag.SetIconWidget().

Exemple de code (probablement vous voulez utiliser l'intérieur OnDragBegin, ou à un point où vous avez un contexte de glisser valide pour être transmis à 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);