【问题标题】:WinForms GDI Rendering not repainting correctlyWinForms GDI 渲染无法正确重绘
【发布时间】:2012-08-26 01:27:15
【问题描述】:

我有一个简单的 WinForms 应用程序,它可以绘制一些彩色矩形。 但是,当调整窗口大小时,它没有正确更新。

已经尝试覆盖 OnResize

protected override void OnResize(EventArgs e)
{
        repaintingMyStuffHere();
}

【问题讨论】:

  • 调整窗口大小时,会发生Paint事件。您在绘制处理程序中的代码(或在后台缓冲区图像中绘制的代码)似乎有错误的坐标。显示一段执行 GDI+ 调用的代码。
  • this 可能会有所帮助..

标签: c# .net winforms gdi


【解决方案1】:

试试这个:

protected override void OnResize(EventArgs e)
{
     this.Invalidate();
     base.OnResize(e);
}

protected override void OnPaint(PaintEventArgs e) {
{
     base.OnPaint(e);
     repaintingMyStuffHere(e.Graphics);
}

如果您仍然有问题,请尝试设置以下控件样式:

public MyClass() {
    this.SetStyle(ControlStyles.AllPaintingInWmPaint | 
                    ControlStyles.OptimizedDoubleBuffer | 
                    ControlStyles.ResizeRedraw | 
                    ControlStyles.UserPaint | 
                    ControlStyles.ResizeRedraw, 
                    true);
}

如果您仍有任何问题,请发布您的 repaintingMyStuffHere 方法。

【讨论】:

  • 不应该调整大小无效吗?至少是窗口的新部分。
  • 如果设置了 Style ControlStyles.ResizeRedraw,则调整大小无效。默认情况下,样式已设置。但是,如果您只想在某些条件下重绘,您可以删除样式并自行调用 this.Invalidate。您是在方法中创建新的 Graphicscontext (this.CreateGraphics) 还是使用 OnPaint 事件中的给定?
【解决方案2】:

要让您的表单/组件呈现属性并帮助提高性能,您需要首先覆盖 OnResize() 方法以使其使表单/组件无效:

protected override void OnResize(EventArgs e)
{
    base.OnResize(e);
    this.Invalidate();
}

然后(可选,但建议减少闪烁)将表单/组件 DoubleBuffered 属性设置为 true:

this.DoubleBuffered = true;

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 2015-03-10
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多