Создание собственного виджета на 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)...*
    }
}

0 ответов

Другие вопросы по тегам