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