使用透明度在Gtk上制作自定义小部件

时间:2012-03-27 03:50:50

标签: mono transparency gtk#

我在Linux上使用Gtk#和mono制作程序,我在时间轴图上创建一个滑块控件。我有它基本上工作,但有一个唠叨问题,我无法弄清楚 - 如何使用Gtk.Style绘图例程,如“PaintBox”和“PaintHLine”时使用透明度。因为我无法弄清楚如何使用这些并仍保持透明度,我目前正在使用Cairo绘图例程,但这不允许我使用Style例程提供的主题一致外观。

目前,我有一个自定义窗口小部件类,它有一个Gtk.DrawingArea。我有一个Cairo.ImageSurface保存在底层Graph的内存中,还有一个单独的Cairo.ImageSurface用于“slider”,它应该被绘制到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 个答案:

没有答案