【问题标题】:Why does a call to BeginPaint() always generate a WM_NCPAINT message?为什么调用 BeginPaint() 总是生成 WM_NCPAINT 消息?
【发布时间】:2010-09-11 03:32:38
【问题描述】:

我在 Win32 API 上遇到问题。我有一个程序,当它处理WM_PAINT 消息时,它调用BeginPaint 来剪辑区域并验证更新区域,但是BeginPaint 函数总是生成具有相同更新区域的WM_NCPAINT 消息,即使如果需要重新绘制的触摸部分仅在客户区域内。

有人知道为什么会这样吗?它位于 WS_CHILD 样式的子窗口上。

【问题讨论】:

  • 您能详细解释一下为什么这会导致您出现问题吗?
  • 主要是性能,因为即使帧不脏,它也会生成帧重绘。我有一个带有一种 CSS 框模型的小部件集,我使用框架来做边距、边框和填充。

标签: c++ windows winapi


【解决方案1】:

我猜WM_NCPAINT 消息的发送总是假设边框也需要重新绘制!

【讨论】:

    【解决方案2】:

    如果您调用SetWindowPos 并将SWP_DEFERERASE 作为uFlags 参数的参数传递会发生什么?

    这应该可以防止生成WM_SYNCPAINT 消息,这会间接导致WM_NCPAINT 消息被发送。

    【讨论】:

    • Window message spy 显示没有生成 WM_SYNCPAINT。问题发生在窗口变脏时(上面有东西,当它消失时需要重绘)而不是调整大小。我正在考虑忘记 BeginPaint() 并自己获取 DC 并通过“手动”验证该区域。
    【解决方案3】:

    WM_PAINT 的 MSDN 条目说:

    如果必须绘制窗口框架,函数可以也发送WM_NCPAINT消息到窗口过程,如果必须擦除窗口背景,则发送WM_ERASEBKGND消息。

    我试图弄清楚为什么即使没有触摸边框也总是发送。我测试在控件内打开一个小记事本并最小化。它不接触控件的边界,只是在内部和BeginPaint() 生成一个WM_NCPAINT

    【讨论】:

      猜你喜欢
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      相关资源
      最近更新 更多