在paint循环C#winforms上无效

时间:2015-03-30 09:56:47

标签: c# winforms

我有一个我绘制的面板,我在paint事件中这样做。我想在绘制之前删除以前的更改,但是如果我使用Invalidate()或Refresh()它会永远重绘它(它是闪烁的),奇怪的是我在任何绘图之前调用Invalidate(),所以如果它只是强制面板油漆我不应该看到图纸

编辑:我想出了这个:

        void _paint(object sender, PaintEventArgs e)
    {
        Panel P = (Panel)sender;
        if (painted = false) { painted = true; P.Invalidate(); }


        Shows(30);
        painted = false;
    }

它停止了闪烁。无论如何,事实证明我从来没有需要它,即使没有失效也会重新粉刷面板。但奇怪的是,当我只隐藏面板的一部分时(通过面板上的窗体调整大小或拖动窗口),当再次变得可见时,它被绘制,而不是重新绘制(我可以说,因为抗锯齿变成纯色,产生糟糕的结果) ,这就是为什么我认为我需要使面板无效。无效不会阻止它发生。我想可能会触发另一个事件,而不是画画。

2 个答案:

答案 0 :(得分:0)

当我用不久前创建的程序调用Invalidate时,我遇到了控制闪烁的问题。我发现重写OnPaintBackGround就可以了,它也可能对你有用;

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        /* Override to stop the background being repainted -> this stops flashing of the text */
    }

答案 1 :(得分:0)

首先,如果全部,则以下条件缺少=符号:

if (painted = false) { painted = true; P.Invalidate(); }

应该阅读

if (painted == false) { painted = true; P.Invalidate(); }

if (!painted) { painted = true; P.Invalidate(); }

其次,双缓冲在很多情况下都是个好主意。为此,将所有内容绘制到屏幕外位图中,该位图与控件的客户区域大小相同,然后根据需要将该位图绘制到目标控件。 OnPaint事件中绘制屏幕外位图,但每当要绘制的内容发生变化时都会显示!

示例:

private void PaintOffscreen()
{
    // Do whatever necessary to draw the offscreen bitmap
    ...

    // Cause the control to repaint itself. Change OnPaint to draw the bitmap only
    Invalidate();
}

void _paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawImage(offscreenBitmap, 0, 0);
}

此外,按照HorHAY的建议覆盖OnPaintBackground方法,以防止控件在绘制之前清除背景。