为啥我无法使用 WM_NCPAINT 刷新对话框,但使用 WM_SIZE 可以正常工作?

Posted

技术标签:

【中文标题】为啥我无法使用 WM_NCPAINT 刷新对话框,但使用 WM_SIZE 可以正常工作?【英文标题】:Why I am not able to refresh dialog box with WM_NCPAINT, but working fine with WM_SIZE?为什么我无法使用 WM_NCPAINT 刷新对话框,但使用 WM_SIZE 可以正常工作? 【发布时间】:2015-01-13 12:04:02 【问题描述】:

我在 MFC 中有对话框应用程序。要刷新对话框上的视图,我们使用WM_NCPAINT,它确实调用了OnNCPaint,但有时视图没有被刷新。行为并不总是可重现的。 WM_PAINT 也发生了同样的行为。

当我们使用 SendMessage(WM_SIZE) 时,行为不可重现,并且按预期工作。

在签入代码之前,我想确定我应该使用WM_SIZE 而不是WM_NCPAINTWM_PAINT,因为它可以正常工作。

【问题讨论】:

为什么要投反对票?我做错了什么? "行为不可重现,并且按预期工作。""SendMessage(WM_SIZE)" 等等。有很多令人反感的东西在问题中。 没有一条 WM_SIZE 消息。 Windows 也会发送大量其他消息以进行调整大小。你只需交叉手指让它工作。但是交叉手指并不是一个好的编程方法。 WM_PAINT 也是如此。有正确的方法。查看答案。 【参考方案1】:

不,你不应该使用其中任何一个。

要指示需要重新绘制窗口,请调用InvalidateRect 函数。这可能是您应该使用的。

要强制重新绘制窗口现在,请调用UpdateWindow 函数。

无论哪种方式,都不要开始发送随机消息并祈祷其中一条消息的副作用是重新绘制窗口。

【讨论】:

【参考方案2】:

如果我正确理解了这个问题,您是在发送 WM 消息来触发对话框的重绘吗?正确的做法是使客户区无效。

您可以直接使用 Windows API 函数 InvalidateRect(),也可以使用 MFC 中的 CWnd::Invalidate() 方法。

【讨论】:

以上是关于为啥我无法使用 WM_NCPAINT 刷新对话框,但使用 WM_SIZE 可以正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥对话框会在不刷新的情况下删除其内容?

为啥如果我使用 React-Router-Dom 刷新页面我无法获得

mfc中让编辑框透明为啥总显示黑色背景的编辑框啊?

为啥我使用 Datatables 的 Rails 应用程序在我使用后退按钮时无法正确绘制表格,但在我刷新页面时却如此?

为啥 Vue 路由器/Webpack 开发服务器现在在页面刷新时显示无法获取/路径?

出现无法显示此页。确保Web地址正常。使用搜索引擎查找页面。请过几分钟后刷新页面