Invalidate和DrawRectangle无法一起使用

时间:2013-08-08 10:25:14

标签: c# invalidation drawrectangle

想象一个简单的.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);
        }
}

3 个答案:

答案 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);
    }
}