0

想象一个简单的 .Net 2.0 Windows-Form,它带有一个填充整个表单的 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);
        }
}
4

3 回答 3

1

调用this.Invalidate();按键,并将您的绘图代码移动到OnPaint它应该去的事件。如果要完全避免闪烁,需要按照以下指南进行绘制:C#,WinForms中的双缓冲?.

您还应该保留List<>所有矩形并绘制每个矩形,OnPaint因为您的按键并不是唯一可以使表单无效并导致重绘的东西。

于 2013-08-08T10:29:11.410 回答
1

你的方法有缺陷。Invalidate()仅请求重绘,但它会延迟并在您绘制矩形后发生。所以它立即又消失了。

一个简短(但错误)的解决方法是替换 Invalidate()Update(),但不要这样做。

您必须将绘图逻辑移动到textBox1.Paint事件中。您的表单需要一个(布尔)属性来决定是否绘制矩形。

您的 KeyDown 应如下所示:

private void OnKeyDown(object sender, KeyEventArgs e)
{
    this.DrawRect = true;
    textBox1.Invalidate();
}
于 2013-08-08T10:31:15.313 回答
-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);
    }
}
于 2013-08-12T11:45:02.447 回答