首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无效和DrawRectangle不一起工作

无效和DrawRectangle不一起工作
EN

Stack Overflow用户
提问于 2013-08-08 10:25:13
回答 3查看 1.2K关注 0票数 0

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

我想:“首先让TextBox失效,然后绘制矩形。”但这不管用。屏幕很快就会闪烁--就是这样。如果我删除“无效”这条线,就会画出一个矩形--但是老的保持它们的位置。

出什么事了?我怎么从头开始重新油漆呢?

提前感谢您的回答!

代码语言:javascript
运行
复制
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);
        }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-12 11:45:02

我被告知要使用"textBox1.Refresh()“而不是”textBox1.inValue()“,而且它可以工作!

代码语言:javascript
运行
复制
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);
    }
}
票数 -1
EN

Stack Overflow用户

发布于 2013-08-08 10:29:11

在按键上调用this.Invalidate();,并将绘图代码移动到它应该到达的OnPaint事件。如果您想要完全避免闪烁,您需要根据以下指南绘制:C#, double buffer in WinForms?

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

票数 1
EN

Stack Overflow用户

发布于 2013-08-08 10:31:15

你的方法有缺陷。Invalidate()只请求重新绘制,但是它会被延迟,并且会在绘制矩形之后发生。所以它立刻又消失了。

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

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

您的KeyDown应该如下所示:

代码语言:javascript
运行
复制
private void OnKeyDown(object sender, KeyEventArgs e)
{
    this.DrawRect = true;
    textBox1.Invalidate();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18123623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档