0

我想在屏幕上显示一些可变的值。我有以下代码

void CMainWnd::OnPaint()
{
    CPaintDC dc(this);
    CRect rcText( 0, 0, 500 ,500 );

    wchar_t text[36];       
    unsigned int num = server->GetNumClients(num);
    wsprintf(text, L"Number of connected clients: %d", num);

    dc.DrawText(text, &rcText, DT_LEFT);
    CFrameWnd::OnPaint();
}

 void CMainWnd::OnTimer(UINT timerID)
 {
     SendMessage(WM_PAINT, 0, 0);
 }

它在窗口出现时绘制文本。但是在接下来的通话中,当文本不同时,屏幕上的文本并没有改变。使用调试器,我可以看到调用了 OnPaint, 文本已更改,但在我的窗口中文本保持不变。GetLastError() 返回 0。我想我错过了 DrawText 工作原理的重要内容。最后我尝试调用 UpdateWindow() ,但没有任何改变。由于某种原因屏幕没有更新..

4

1 回答 1

3

您不应直接发送绘制消息,而应使要重新绘制的区域无效 (InvalidateRect(&area) ) 并让系统处理它。只发送一个绘画,你什么也得不到,因为系统说“没有需要绘画的区域,所以为了效率我不会打扰”——或者更确切地说,限制绘画的剪辑区域将是空的(没有更新区域)。通过使某个区域无效,您可以告诉系统该区域需要重新绘制,因此下一次绘制调用将具有有效的剪辑区域,您将看到更改。

(最好使用带有缓冲区大小的 wsprintf_s() - 事实上,因为您似乎正在使用 MFC,所以请改用 CString 和 CString::Format() - 而且您不应该调用基类 OnPaint() (它没有效果,因为当 CPaintDC 超出范围时,它会清除任何更新区域)。

于 2012-03-27T10:14:21.247 回答