为什么调用BeginPaint()总是生成WM_NCPAINT消息?
时间:2020-03-06 14:25:04 来源:igfitidea点击:
我在Win32 API上遇到问题。我有一个程序,当它处理" WM_PAINT"消息时,会调用" BeginPaint"来裁剪区域并验证更新区域,但是" BeginPaint"功能始终会生成具有相同更新区域的" WM_NCPAINT"消息,如果需要重新粉刷的接触部分仅在客户区域内。
有人知道为什么会这样吗?它位于具有WS_CHILD样式的子窗口中。
解决方案
我猜想总是在假设边框也需要重新粉刷的情况下发送" WM_NCPAINT"消息!
WM_PAINT的MSDN条目说:
The function may also send the WM_NCPAINT message to the window procedure if the window frame must be painted and send the WM_ERASEBKGND message if the window background must be erased.
我试图弄清楚为什么即使不触摸边框也总是发送。我测试了在控件内部打开一个小的记事本并将其最小化。它不触碰控件的边界,只是在内部,而BeginPaint()
会生成WM_NCPAINT
。
如果调用SetWindowPos
并传递SWP_DEFERERASE
作为uFlags`参数的参数,会发生什么?
这应该防止生成" WM_SYNCPAINT"消息,这将间接导致发送" WM_NCPAINT"消息。