我有一个画板,我在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;
}
它不再闪烁了。无论如何,事实证明我从来不需要它,即使没有失效,它也会重新绘制面板。但奇怪的是,当我只隐藏面板的一部分时(无论是通过调整窗体大小还是在面板上拖动窗口),当它再次变得可见时,它会被绘制,而不是重新绘制(我可以看出,因为抗锯齿变成纯色,产生糟糕的结果),这就是为什么我认为我需要使面板无效。无效并不能阻止它的发生。我认为可能是触发了另一个事件,而不是画图。
发布于 2015-03-30 09:59:50
当我用不久前创建的一个程序调用Invalidate时,我遇到了控件闪烁的问题。我发现覆盖OnPaintBackGround确实起到了作用,它可能也适用于您;
protected override void OnPaintBackground(PaintEventArgs e)
{
/* Override to stop the background being repainted -> this stops flashing of the text */
}
发布于 2015-03-30 11:01:41
首先,以下条件缺少=
符号:
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
方法,以防止控件在绘制自身之前清除背景。
https://stackoverflow.com/questions/29343228
复制相似问题