【发布时间】:2009-05-13 08:13:38
【问题描述】:
我有一个 Visual C++ 项目,但我无法刷新窗口并重绘自身。 我用过
RedrawWindow();
m_ProgressDlg->RedrawWindow();
还有
UpdateData(false);
m_ProgressDlg->UpdateData(false);
但似乎永远不会顺利。
我该怎么办?
【问题讨论】:
标签: c++ visual-c++ refresh
我有一个 Visual C++ 项目,但我无法刷新窗口并重绘自身。 我用过
RedrawWindow();
m_ProgressDlg->RedrawWindow();
还有
UpdateData(false);
m_ProgressDlg->UpdateData(false);
但似乎永远不会顺利。
我该怎么办?
【问题讨论】:
标签: c++ visual-c++ refresh
您可以将UpdateWindow 与InvalidateRect 结合使用以立即重绘。
【讨论】:
对于客户区使用 InvalidateRect + UpdateWindow。 如果要重绘窗口的非客户区,请尝试使用 SWP_DRAWFRAME | 调用 SetWindowPos SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE。
【讨论】:
UpdateWindow 在 PROC 处理 WM_PAINT 之前不会返回。
看起来您正在使用 MFC。
我相信您的应用程序很忙并且没有处理来自队列的消息,因此它没有处理会更新窗口的 WM_PAINT。
使用带有 RedrawWindow 的 RDW_UPDATENOW 参数来强制重绘,即使您的窗口很忙。
【讨论】:
::InvalidateRect(hwnd, NULL, TRUE) WinAPI 函数(或 wnd->InvalidateRect(NULL) 方法)应该可以解决问题:它使客户区无效并导致系统向窗口发送 WM_PAINT 以重绘它。如果你想立即重绘,你也应该在失效后调用 UpdateWindow()。
【讨论】:
但在发布版本中,如果使用 openeed worspace 它似乎也无法正常运行
【讨论】:
您可能还尝试在 m_hWnd 为 NULL 时调用 Invalidate() 和 RedrawWindow(),如果“不顺利”意味着崩溃。试试:
if (m_hWnd)
{
Invalidate();
RedrawWindow();
}
(我知道这已经过时了,但我们中的一些人的一只脚仍然卡在 MFC 的渣滓中。)
【讨论】: