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 C++:运行时内存调试器刷新

在 Visual Studio 的监视窗口中自动刷新 [重复]

Visual C++ 6 中对话窗口的有效重叠

如何在 GUI 输出窗口而不是 Visual Studio 2015 中的 cmd 控制台上显示我的 C++ 程序输出?

visual studio 2010 C++,怎么通过点击主窗口上一个按钮控件,弹出一个类似于主窗口的窗口?

在新窗口终端中使用 Visual Studio Code 中的终端运行