在 Windows 窗体应用程序上绘制超出控件可见坐标范围的图表时出现无穷无尽的问题

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

所以我在 VS2022 中的 VB.NET 中有一个 Windows 窗体应用程序。

我需要画一些几何图(圆、线、弧、矩形等)。我知道该怎么做。这很简单,不是问题。

问题是,如果我在图片框上绘图,并且图表超出了图片框的可见限制,则图像的其余部分会被剪切,我无法访问它。

我检查是否可以向图片框添加滚动条。事实证明,我不能。

所以我用面板切换了图片框并在面板上绘图。我在父窗体的 load() 中向面板添加了滚动条,如下所示:

Dim rect As New Rectangle(0, 0, 800, 1000)
pnlResult.AutoScrollMinSize = rect.Size

这可以方便地在面板上添加急需的滚动条(当然,自动滚动已打开)。但现在当我尝试向下滚动时,图表消失了。

为了解决这个问题,我将所有图表绘制代码放在面板的 pain() 事件中,如下所示:

Private Sub pnlResult_Paint(sender As Object, e As PaintEventArgs) Handles pnlResult.Paint
    DrawDiagrams(pnlResult, diag_array, diag_count)
End Sub

但是当我向下滚动时,它开始在已经绘制的图表上一遍又一遍地绘制。为了缓解这种情况,我在 DrawDiagrams() 之前输入了使面板无效的代码:

    pnlResult.Invalidate()
    DrawDiagrams(pnlResult, diag_array, diag_count)

但现在面板正在积极刷新自身,使整个表单处于冻结状态。

我该怎么办?

新手程序员难道不能在图像框上获得滚动条并解决这种令人头痛的问题吗?

winforms visual-studio-2022 panel picturebox paintevent
1个回答
0
投票

您可以根据当前滚动位置进行绘制,该位置可通过面板的 AutoScrollPosition 属性获得。当您滚动时,面板的位置会发生变化,因此绘图需要相应地移动。

避免过度使用 Invalidate(),因为它可能导致性能问题。

直接在 PaintEventArgs 中传递的 Graphics 对象上绘制以管理正确的滚动行为。

当然正如@Idle_Mind所说,在面板中嵌入足够大的PictureBox并向面板添加滚动条是一个更简单的解决方案。

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