Создание собственного виджета на Gtk с прозрачностью
Я использую Gtk# и mono в Linux, чтобы создать программу, в которой я создаю ползунок для управления графиком шкалы времени. У меня это в основном работает, но есть одна неприятная проблема, которую я не могу понять - как использовать прозрачность при использовании процедур рисования Gtk.Style, таких как "PaintBox" И "PaintHLine". Поскольку я не мог понять, как их использовать и по-прежнему поддерживать прозрачность, в настоящее время я использую процедуры рисования в Каире, но это не позволяет мне использовать согласованный внешний вид темы, предоставляемый процедурами стиля.
В настоящее время у меня есть собственный класс виджетов, который имеет Gtk.DrawingArea. У меня есть Cairo.ImageSurface, сохраняемый в памяти для основного графика, и отдельный Cairo.ImageSurface для "ползунка", который должен быть нарисован на DrawingArea, чтобы установить местоположение на временной шкале.
Проблема в том, что я не могу на всю жизнь определить, как заставить мои функции Gtk.Style.Paint... рисовать на моем Cairo.ImageSurface и при этом сохранять прозрачность. Вот пример кода, который в основном то, что у меня сейчас есть:
private Cairo.ImageSurface graphImage;
private Cairo.ImageSurface gripImage;
private int grip_width;
private int grip_height;
public void MainClass() {
*...(initialization code here)...*
}
private override void OnExposeEvent() {
if (graphImage == null) {
graphImage = new Cairo.ImageSurface(Format.Rgba,graphDrawingArea.Allocation.Width,graphDrawingArea.Allocation.Height);
}
if (gripImage == null) {
gripImage = new Cairo.ImageSurface(Format.Rgba,grip_width,grip_height);
}
DrawGraph();
DrawGrip();
}
private override void OnResizeEvent() {
MakeGraph();
MakeGrip();
}
private void MakeGraph() {
using (Cairo.Context context = Gdk.CairoHelper(graphImage)) {
*...(use cairo drawing routines to draw the graph)...*
}
}
private void MakeGrip() {
using (Cairo.Context context = Gdk.CairoHelper(gripImage)) {
*...(use cairo drawing routines to draw the graph)...*
}
}
private void DrawGraph() {
using (Cairo.Context context = Gdk.CairoHelper(graphDrawingArea.GdkWindow)) {
*...(use cairo to "paint" the graphImage onto our drawing area at the proper location)...*
}
}