想象一个简单的.Net 2.0 Windows-Form,其中包含一个填充整个表单的MultilineTextbox。 每按一次键,我想(重新)绘制一个矩形。在实际的应用程序中,关于矩形的位置和东西有更多的逻辑 - 但要保持简单。
我想:“让我们首先使TextBox无效,然后绘制矩形。”但这不起作用。屏幕瞬间闪烁 - 就是这样。如果我删除“invaliate”行a 绘制了矩形 - 但旧的矩形保持其位置..
什么错了?我如何从头开始重画?
提前感谢您的回答!
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);
}
}
答案 0 :(得分:1)
在按键上调用this.Invalidate();
,并将您的绘图代码移动到它应该去的OnPaint
事件。如果您想完全避免闪烁,则需要根据以下指南进行绘制:C#, double buffer in WinForms?。
您还应该保留List<>
所有作品并绘制每一个OnPaint
,因为您的按键不是唯一可以使表单无效并导致重绘的内容。
答案 1 :(得分:1)
你的方法存在缺陷。 Invalidate()
仅请求重新绘制,但会延迟并在绘制矩形后发生。所以它会立即消失。
一个简短(但错误)的修复方法是将Invalidate()
替换为Update()
,但不要这样做。
您必须将绘图逻辑移至textBox1.Paint
事件。并且您的表单需要一个(boolean)属性来决定是否绘制Rectangle。
您的KeyDown应如下所示:
private void OnKeyDown(object sender, KeyEventArgs e)
{
this.DrawRect = true;
textBox1.Invalidate();
}
答案 2 :(得分:-1)
我被告知使用“textBox1.Refresh()”而不是“textBox1.Invalidate();”它有效!
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);
}
}