【问题标题】:c# - clear surface when resizingc# - 调整大小时清除表面
【发布时间】:2010-05-13 14:56:58
【问题描述】:

我正在尝试在 C#.Net 中为 Windows 窗体应用程序构建自己的自定义控件。目前我使用paint事件绘制一些矩形和其他图形元素。 当我现在调整应用程序表单的大小以适应桌面大小时,所有元素都被重新绘制(这正是我需要的行为),但旧的元素显示在背景中。

这是我现在正在做的事情:

Pen penDefaultBorder = new Pen(Color.Wheat, 1);
int margin = 5;
private void CustomControl_Paint(object sender, PaintEventArgs e) {
    CustomControl calendar = (CustomControl)sender;
    Graphics graphics = e.Graphics;
    graphics.Clear(Color.WhiteSmoke);

    graphics.DrawRectangle(penDefaultBorder, margin, margin, calendar.Width - margin * 2, calendar.Height - margin * 2);
    //...
}

graphics.Clear 和添加 graphics.FillRectangle(...) 都不会隐藏表面上的旧矩形。

想法?谢谢大家。

【问题讨论】:

    标签: c# .net graphics custom-controls resizable


    【解决方案1】:

    Paint 事件通常不会请求更新整个画布,仅请求 PaintEventArgs 中指定的区域。我猜发生的事情是只有画布的新暴露区域在 PaintEventArgs 中传递。

    这是您不应该在 Paint 事件中进行任何渲染的原因之一。您应该渲染到屏幕外位图 - 一个缓冲区 - 并在 Paint 事件中从该缓冲区复制到控件的画布。

    在此处或在 Google 上搜索“双缓冲”将为您提供该技术的许多示例。

    【讨论】:

    • 感谢您的提示 - 我发现了一些关于双缓冲的有趣文章。我会看看那些。
    【解决方案2】:

    您是否尝试过.Invalidate() 使表单重绘?

    【讨论】:

    • 这行得通;这有点像霰弹枪的方法,但它会起作用。我仍然更喜欢仅在需要更改时才渲染缓冲区,并复制 OnPaint 中请求的区域。
    • 嗯 - 这很简单 ;-) 感谢您的帮助,现在调整大小可以按预期进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2016-06-18
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多