هل يمكنني استخدام الرموز مع شفافية RGBA عند استخدام GTK+ سحب وإسقاط؟
-
29-09-2019 - |
سؤال
أنا بصدد إضافة دعم السحب وإسقاط إلى تطبيق 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);