想象一下一个简单的.Net 2.0 Windows窗体,它有一个填充整个表单的MultilineTextbox。每次按下键,我都想(重新)画一个矩形。在实际应用中,关于矩形的位置和内容有更多的逻辑--但要保持简单。
我想:“首先让TextBox失效,然后绘制矩形。”但这不管用。屏幕很快就会闪烁--就是这样。如果我删除“无效”这条线,就会画出一个矩形--但是老的保持它们的位置。
出什么事了?我怎么从头开始重新油漆呢?
提前感谢您的回答!
private void OnKeyDown(object sender, KeyEventArgs e)
{
textBox1.Invalidate();
using (Graphics g = this.textBox1.CreateGraphics())
{
int startX = 100;
int startY = 300;
int height = 200;
Brush brush = new SolidBrush(Color.FromArgb(60, 255, 0, 0));
Pen myPen = new Pen(Color.Black, 2);
myPen.DashStyle = DashStyle.Dash;
g.DrawRectangle(myPen, startX, startY, this.textBox1.Width, height);
g.FillRectangle(brush, startX, startY, this.textBox1.Width, height);
}
}发布于 2013-08-12 11:45:02
我被告知要使用"textBox1.Refresh()“而不是”textBox1.inValue()“,而且它可以工作!
private void OnKeyDown(object sender, KeyEventArgs e)
{
//textBox1.Invalidate(); - Dont do that
textBox1.Refresh(); //Dominik Schelenz, my internet Hero for today!
using (Graphics g = this.textBox1.CreateGraphics())
{
int startX = 100;
int startY = 300;
int height = 200;
Brush brush = new SolidBrush(Color.FromArgb(60, 255, 0, 0));
Pen myPen = new Pen(Color.Black, 2);
myPen.DashStyle = DashStyle.Dash;
g.DrawRectangle(myPen, startX, startY, this.textBox1.Width, height);
g.FillRectangle(brush, startX, startY, this.textBox1.Width, height);
}
}发布于 2013-08-08 10:29:11
在按键上调用this.Invalidate();,并将绘图代码移动到它应该到达的OnPaint事件。如果您想要完全避免闪烁,您需要根据以下指南绘制:C#, double buffer in WinForms?。
您还应该保留所有重新绘制的List<>,并绘制每个OnPaint,因为按键并不是唯一可以使表单失效并导致重绘的东西。
发布于 2013-08-08 10:31:15
你的方法有缺陷。Invalidate()只请求重新绘制,但是它会被延迟,并且会在绘制矩形之后发生。所以它立刻又消失了。
一个简短(但错误)的修复方法是用Invalidate()替换Update(),但不要这样做。
您必须将绘图逻辑移动到textBox1.Paint事件。您的表单需要一个(布尔值)属性来决定是否绘制矩形。
您的KeyDown应该如下所示:
private void OnKeyDown(object sender, KeyEventArgs e)
{
this.DrawRect = true;
textBox1.Invalidate();
}https://stackoverflow.com/questions/18123623
复制相似问题