GtkSharp:滚动的 DrawingArea 无法使用 IdentityMatrix 正确渲染

问题描述 投票:0回答:1

以下最小示例将 DrawingArea 放入 ScrolledWindow 中。在绘制事件反应中,绘制(部分)圆盘。当行 args.Cr.IdentityMatrix(); 时使用后,绘图无法正常工作,尽管应该不会有任何效果。没有线路,一切正常。问题发生在滚动过程中。该区域的某些矩形部分似乎没有更新。这是在 Windows 11 计算机上使用 GtkSharp 3.24.24 和 .NET 6.0(但我也可以在 Mac 上看到相同的效果)。

MinimalExample.cs

using Gtk; // GtkSharp (3.24.24.*), .NET 6.0, Windows 11

public class MainWindow : Window
{
    public MainWindow() : base(WindowType.Toplevel)
    {
        DrawingArea Area = new DrawingArea();
        Area.SetSizeRequest(1000, 1000);
        Area.Drawn += AreaDrawn;
        ScrolledWindow Win = new ScrolledWindow { Area };
        Win.SetSizeRequest(500, 500);
        Add(Win);
        ShowAll();
    }
    void AreaDrawn(object sender, DrawnArgs args)
    {
        args.Cr.IdentityMatrix();
        args.Cr.SetSourceRGB(1.0, 0.0, 0.0);
        args.Cr.NewPath();
        args.Cr.Arc(120, 120, 120, 0, 5);
        args.Cr.Fill();
        args.Cr.Dispose();
    }
}

class Program
{
    public static void Main()
    {
        Application.Init();
        Window mainWindow = new MainWindow();
        Application.Run();
    }
}

它应该看起来像:correct rendering,但通常看起来更像bad rendering。难道我做错了什么?我知道,在这个最小的示例中,我可能会跳过 IdentiyMatrix() 调用,但在提取这个最小示例的更大项目中,我需要它。

期望:在 ScrolledWindow 内的 Gtk DrawingArea 上渲染一些绘图在滚动期间也应该正确显示。 观察:绘图混乱。

gtk scrolledwindow drawingarea
1个回答
0
投票

同时,我找到了解释:滚动后,args.Cr中的矩阵不再是单位矩阵,而是包含一个偏移量(对应于滚动的距离)。所以将其设置回单位矩阵是错误的。在操作它之前应该记住 args.Cr 中的矩阵(例如用于绘图的旋转),然后将其恢复到事件中传递的原始矩阵而不是恒等式。

我遇到了这个问题,因为 Cairo 上下文的处理由于 CairoHelper 的弃用而发生了变化,它总是为请求的 GdkWindow 提供一个 (0,0) 根矩阵。

© www.soinside.com 2019 - 2024. All rights reserved.