无效和绘制矩形不能协同工作



想象一个简单的.Net 2.0 Windows窗体,其中包含一个填充整个窗体的MultilineTextbox。每次按键时我都想(重新)画一个矩形。在实际应用程序中,关于矩形的位置和内容有更多的逻辑,但要保持简单。

我想:"让我们先让TextBox无效,然后画矩形。"但这行不通。屏幕很快就会闪烁-就是这样。如果我去掉"inviate"一行绘制了矩形,但旧的保持其位置。。

怎么了?我该如何从头开始重新喷漆?

提前感谢您的回答!

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

您的方法有缺陷。Invalidate()只请求重新绘制,但它被延迟,并在绘制矩形后发生。所以它马上又消失了。

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

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

你的KeyDown应该看起来像:

private void OnKeyDown(object sender, KeyEventArgs e)
{
    this.DrawRect = true;
    textBox1.Invalidate();
}

在按键时调用this.Invalidate();,并将绘图代码移动到OnPaint事件应该去的地方。如果你想完全避免闪烁,你需要根据以下指南绘制:C#,WinForms中的双缓冲区?。

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

有人告诉我使用"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);
    }
}

相关内容

  • 没有找到相关文章

最新更新