0

I've a Visual C++ project but I don't be able to refresh the window and redraw itself. I've used

RedrawWindow();
m_ProgressDlg->RedrawWindow();

and also

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

but never seems go well.

How can I do?

4

6 回答 6

5

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

于 2009-05-13T08:54:37.573 回答
2

对于客户区,使用 InvalidateRect + UpdateWindow。如果要重绘窗口的非客户区,请尝试使用 SWP_DRAWFRAME | 调用 SetWindowPos SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE。

于 2009-05-13T12:03:52.337 回答
1

::InvalidateRect(hwnd, NULL, TRUE) WinAPI 函数(或 wnd->InvalidateRect(NULL) 方法)应该可以解决问题:它使客户区无效并导致系统将 WM_PAINT 发送到窗口以重绘它。如果您想立即重绘,您还应该在失效后立即调用 UpdateWindow()。

于 2009-05-13T08:18:32.157 回答
1

看起来你正在使用 MFC。

我相信您的应用程序很忙并且没有处理来自队列的消息,因此它没有处理会更新窗口的 WM_PAINT。

使用带有 RedrawWindow 的 RDW_UPDATENOW 参数来强制重绘,即使您的窗口很忙。

于 2009-05-13T08:31:26.067 回答
0

但是在发布版本中,如果使用 openeed worspace 它似乎也无法正常运行

于 2009-05-13T10:22:05.060 回答
0

您可能还尝试在 m_hWnd 为 NULL 时调用 Invalidate() 和 RedrawWindow(),如果“不顺利”意味着崩溃。尝试:

if (m_hWnd)
{
   Invalidate();
   RedrawWindow();
}

(我知道这已经过时了,但我们中的一些人仍然将一只脚卡在 MFC 的垃圾中。)

于 2018-05-03T18:18:08.827 回答