1

現在、既存のMono / C#/ GTK#アプリケーションにドラッグアンドドロップのサポートを追加しています。オブジェクトのドラッグを開始したときに、マウスポインタの下に表示されるアイコンにRGBA透明度を使用できるかどうか疑問に思いました。

これまでのところ、私は次のことに気づきました。

  • メソッドを呼び出すことで、問題のビットマップを設定できGtk.Drag.SourceSetIconPixbuf()ます。ただし、アルファ透明度では運がありません。完全に不透明でないピクセルは、この方法で100%透明になります。
  • また、のRGBAカラーマップで使用できるようにを呼び出しRenderPixmapAndMask()てみました。どちらも機能しませんでした。ドラッグを開始するたびに、次のエラーが発生しました。GdkPixbufGtk.Drag.SourceSetIcon()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))。

4

1 に答える 1

0

さて、ようやく解決しました。新しいタイプを作成し、それを画面のRGBAカラーマップに設定しGtk.Window、Cairoによって背景を透明色に消去し、好きなものを描画して、最後にに渡す必要があります。POPUPColormapGtk.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);
于 2010-10-28T11:42:07.997 に答える