【问题标题】:WinForms paint cycle documentation?WinForms 绘制周期文档?
【发布时间】:2011-08-11 11:49:59
【问题描述】:

是否有关于 WinForms 中绘制周期的文档?

当我在 Windows 中编程时,绘制周期通常是以下形式:

sent a WM_PAINT message
{
   call BeginPaint(&paintStruct)

      //BeginPaint sends WM_NCPAINT and WM_ERASEBKGND
      sent a WM_ERASEBKGND message
      {
         i can:
           - allow default processing (Windows will fill the area with the default background color (e.g. white)
           - erase and background myself (e.g. a gradient) and prevent default processing
           - do nothing (letting whatever was there before me stay there) and prevent default processing
      }

   perform whatever painting i desire on 
         paintStruct.hDC (Device Context)
         paintStruct.rcPaint (Invalid Rectangle)
   that was populated into paintStruct during BeginPaint

   call EndPaint()
}

这一切都记录在 MSDN 上:Windows Development\Graphics and Multimedia\Windows GDI\Painting and Drawing\About Painting and Drawing

我找不到任何关于 WinForms 及其绘制周期的此类文档。我可以随机找到名称为 paint 的方法和事件:

  • OnPaint(受保护的方法“引发 Paint 事件。”)
  • OnPrint(受保护的方法“引发 Paint 事件。”)
  • InvokePaint(受保护的方法“引发指定控件的 Paint 事件。”)
  • Paint(公开活动)
  • InvokePaintBackground(受保护的方法“引发指定控件的 PaintBackground 事件。”)
  • OnPaintBackground(受保护的方法“绘制控件的背景。”)

注意:忽略没有PaintBackground事件的事实

是否有描述这些实体之间设计关系的文档? WinForms 中是否有关于绘制周期的文档?

【问题讨论】:

    标签: winforms paint


    【解决方案1】:

    它与本机 Windows 绘制周期没有本质区别,.NET 事件由相应的 Windows 消息引发。从底部开始,消息由窗口管理器或应用程序本身调用 InvalidateRect() 生成。 .NET 版本是 Control.Invalidate()。 Windows 跟踪窗口的更新区域,决定是否传递 WM_PAINT、WM_NCPAINT 和 WM_ERASEBKGND 消息。

    当 ControlStyles.UserPaint 样式打开时,Control.WndProc() 可以识别 WM_PAINT 和 WM_ERASEBKGND 消息。它调用虚拟 OnPaint() 和 OnPaintBackground() 方法。派生控件可以覆盖这些方法以根据需要自定义绘画。并且必须调用基本方法。最终到达 Control.OnPaint/Background 方法,该方法触发 Paint 和 PaintBackground 事件以允许其他代码自定义绘画。

    唯一的另一个问题是双缓冲,由 DoubleBuffered 属性启用。 Winforms 为控件创建一个位图缓冲区并运行 OnPaintBackground() 和 OnPaint(),传递从该位图创建的 Graphics 对象。然后将位图blit到屏幕上。

    【讨论】:

    • 我们在这里开始缺乏文档,但UserPaint 文档说“如果为假,则不会引发 Paint 事件。”这是否意味着Paint event 没有被提出?还是说OnPaint方法不会被调用?我注意到Opaque(“如果为真,控件绘制为不透明且背景未绘制”)对OnPaintBackground 有任何影响吗?我看到更多:AllPaintingInWmPaintOptimizedDoubleBuffer.
    • 我会接受杰森的回答。严格来说,我要求提供文件。虽然 MSDN 文档可能非常不足,但它正是我所寻找的。虽然这个答案作为 MSDN 的补充非常有用 (+1)。
    【解决方案2】:

    这是你要找的吗?

    MSDN: Custom Control Painting and Rendering


    OP 编辑​​:当微软实施他们的下一轮链接中断时,文档的位置是:

    • MSDN 库
      • 开发工具和语言
        • Visual Studio 2010
          • 视觉工作室
            • 创建基于 Windows 的应用程序
              • Windows 窗体
                • Windows 窗体入门
                  • Windows 窗体控件
                    • 使用 .NET Framework 开发自定义 Windows 窗体控件
                      • 自定义控件绘制和渲染

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 2016-11-16
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 2014-03-25
      相关资源
      最近更新 更多