面板控件绘制事件不适用于用户控件

5 c# winforms

我创建了一个Windows窗体用户控件,我拖动,在其中放置一个面板,在面板上我在Panel的Paint事件中绘制了图形.

private void pnlViewer_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.TranslateTransform(pnlViewer.AutoScrollPosition.X, pnlViewer.AutoScrollPosition.Y);
    e.Graphics.FillRectangle(Brushes.Black, Screen.PrimaryScreen.Bounds);
    //**draw Y Axis**
    int y;
    for (int i = 0; i <= 50; i++)
    {
        y = (i * cellHeight) + cellHeight;
        e.Graphics.DrawLine(new Pen(Color.FromArgb(50, 50, 50)),
                            new Point(0, y), new Point(pageWidth, y));
    }
    //**draw X Axis**
    int x;
    for (int i = 0; i < 50; i++)
    {
        x = (i * cellWidth) + ribbonWidth;
        e.Graphics.DrawLine(new Pen(Color.FromArgb(50, 50, 50)),
                            new Point(x, 0), new Point(x, pageHeight));
    }
    DrawWaveForm(e.Graphics); **// Here the actual data of graph will draw**
}
Run Code Online (Sandbox Code Playgroud)

当我将此用户控件拖到WinForm上时,它会从Windows窗体中调用此用户控件的绘制事件,但在调用此事件时会显示图形,但在一段时间后图形变为空白.

我尝试了Invalidate(true), Update(), Refresh()所有这些方法,但它们毫无用处.

实际上它显示了图形的一半,然后在下一个相同的绘制事件被触发后,它显示了我需要的完整图形,但实际上我想要第一个Paint事件而不是显示完整图形的半图.

Han*_*ant 3

    e.Graphics.DrawLine(new Pen(Color.FromArgb(50, 50, 50)),
                        new Point(0, y), new Point(pageWidth, y));
Run Code Online (Sandbox Code Playgroud)

您没有在此代码中处理 System.Drawing 对象。也可能在其他代码中。这可能会很长一段时间被忽视,垃圾收集器往往会隐藏问题。但是,如果它运行得不够频繁,那么操作系统可能会对您使用如此多的 GDI 句柄感到不满,并且不允许您的程序创建更多的 GDI 句柄。配额为 10,000 个手柄,虽然数量很大,但如果经常重新绘制,很容易消耗掉。例如,当您绘制不断更新的图表时,这是典型的情况。接下来发生的情况各不相同,介于异常和注意到程序不再正确绘制之间。

始终在绘制代码中使用using语句来避免这种失败模式:

using (var pen = new Pen(Color.FromArgb(50, 50, 50))) {
    e.Graphics.DrawLine(pen, new Point(0, y), new Point(pageWidth, y));
}
Run Code Online (Sandbox Code Playgroud)