Visual C++ 中的刷新窗口
Posted
技术标签:
【中文标题】Visual C++ 中的刷新窗口【英文标题】:Refresh Window in Visual C++ 【发布时间】:2009-05-13 08:13:38 【问题描述】:我有一个 Visual C++ 项目,但我无法刷新窗口并重绘自身。 我用过
RedrawWindow();
m_ProgressDlg->RedrawWindow();
还有
UpdateData(false);
m_ProgressDlg->UpdateData(false);
但似乎永远不会顺利。
我该怎么办?
【问题讨论】:
【参考方案1】:您可以将UpdateWindow 与InvalidateRect 结合使用以立即重绘。
【讨论】:
【参考方案2】:对于客户区使用 InvalidateRect + UpdateWindow。 如果要重绘窗口的非客户区,请尝试使用 SWP_DRAWFRAME | 调用 SetWindowPos SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE。
【讨论】:
绝对的救命稻草。实际上更像是理智的保护者。一直在寻找这样的解决方案。谢谢。UpdateWindow
在 PROC 处理 WM_PAINT 之前不会返回。
在不调用 OnSize 的情况下绘制(绘图)窗口框架是正在寻找的。想要这个用于调试和设计目的。它不会出现在最终代码中,但有助于故障排除。【参考方案3】:
看起来您正在使用 MFC。
我相信您的应用程序很忙并且没有处理来自队列的消息,因此它没有处理会更新窗口的 WM_PAINT。
使用带有 RedrawWindow 的 RDW_UPDATENOW 参数来强制重绘,即使您的窗口很忙。
【讨论】:
【参考方案4】:::InvalidateRect(hwnd, NULL, TRUE) WinAPI 函数(或 wnd->InvalidateRect(NULL) 方法)应该可以解决问题:它使客户区无效并导致系统向窗口发送 WM_PAINT 以重绘它。如果你想立即重绘,你也应该在失效后调用 UpdateWindow()。
【讨论】:
InvalidateRect 不会立即起作用,它只会导致最终生成 WM_PAINT 消息。其他消息具有优先权,因此可能需要一段时间才能重新绘制窗口。这通常是您想要的 - 应用程序不应该仅仅因为它不断地重新绘制自己而变得无响应。 是的,您是对的,感谢您的通知 - 上一个帖子版本中的“立即”。固定。【参考方案5】:但在发布版本中,如果使用 openeed worspace 它似乎也无法正常运行
【讨论】:
不清楚您回复的是哪个答案。将您的回答作为编辑放入原始问题中。【参考方案6】:您可能还尝试在 m_hWnd 为 NULL 时调用 Invalidate() 和 RedrawWindow(),如果“不顺利”意味着崩溃。试试:
if (m_hWnd)
Invalidate();
RedrawWindow();
(我知道这已经过时了,但我们中的一些人的一只脚仍然卡在 MFC 的渣滓中。)
【讨论】:
以上是关于Visual C++ 中的刷新窗口的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 的监视窗口中自动刷新 [重复]
如何在 GUI 输出窗口而不是 Visual Studio 2015 中的 cmd 控制台上显示我的 C++ 程序输出?