Создание собственного виджета на Gtk с прозрачностью - PullRequest
1 голос
/ 27 марта 2012

Я использую 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)...*
    }
}
...