使用CDC :: DrawText绘制可更改的文本

时间:2012-03-27 10:09:40

标签: c++ winapi mfc onpaint drawtext

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

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被调用, text 已被更改,但在我的窗口上文本保持不变。 GetLastError()返回0.我想我错过了一些重要的DrawText工作原理。我最终试图调用UpdateWindow(),但没有任何改变。出于某种原因,屏幕不是更新..

1 个答案:

答案 0 :(得分:3)

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

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