【问题标题】:Refresh Window in Visual C++Visual C++ 中的刷新窗口
【发布时间】:2009-05-13 08:13:38
【问题描述】:

我有一个 Visual C++ 项目,但我无法刷新窗口并重绘自身。 我用过

RedrawWindow();
m_ProgressDlg->RedrawWindow();

还有

UpdateData(false);
m_ProgressDlg->UpdateData(false);

但似乎永远不会顺利。

我该怎么办?

【问题讨论】:

    标签: c++ visual-c++ refresh


    【解决方案1】:

    您可以将UpdateWindowInvalidateRect 结合使用以立即重绘。

    【讨论】:

      【解决方案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 的渣滓中。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-26
          • 1970-01-01
          • 2015-01-08
          • 2022-01-10
          • 1970-01-01
          • 2013-03-04
          • 2011-12-11
          • 1970-01-01
          相关资源
          最近更新 更多