هل يمكنني استخدام الرموز مع شفافية RGBA عند استخدام GTK+ سحب وإسقاط؟

StackOverflow https://stackoverflow.com/questions/3899254

سؤال

أنا بصدد إضافة دعم السحب وإسقاط إلى تطبيق Mono/C#/GTK# الحالي. كنت أتساءل عما إذا كان من الممكن استخدام شفافية RGBA على الرموز التي تظهر تحت مؤشر الماوس عندما أبدأ في سحب كائن.

حتى الآن ، أدركت ما يلي:

  • يمكنني تعيين صورة نقطية في السؤال عن طريق الاتصال Gtk.Drag.SourceSetIconPixbuf() طريقة. ومع ذلك ، لا حظ مع شفافية ألفا: وحدات البكسل غير الشفافة بالكامل ستصبح شفافة بنسبة 100 ٪ بهذه الطريقة.
  • حاولت الاتصال أيضًا RenderPixmapAndMask() على ال GdkPixbuf حتى أتمكن من استخدام Gtk.Drag.SourceSetIcon() مع RGBA colormap من بلدي 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).).

هل كانت مفيدة؟

المحلول

حسنًا ، أخيرًا قمت بحلها. يجب عليك إنشاء جديد Gtk.Window من POPUP اكتب ، اضبطها Colormap إلى شاشتك RGBA Colormap ، احصل على الخلفية التي تم محوها بواسطة القاهرة إلى لون شفاف ، ارسم ما تريد عليه وأخيراً تمريره إليه Gtk.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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top