我在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)...*
}
}