2012-03-27 139 views
0

我想在屏幕上显示一些值,这是可以改变的。我有以下代码用CDC绘制可改变的文本:: 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被调用,文本已被更改,但在我的窗口文本保持不变。 GetLastError()返回0.我认为我错过了一些重要的DrawText工作原理。我试图在最后调用UpdateWindow(),但没有任何改变。由于某些原因,屏幕未更新。

回答

3

您不应直接发送画图消息,而是使要重新绘制的区域无效(InvalidateRect(&区域))并让系统处理它。通过只发送一个油漆,你不会得到任何东西,因为系统说'没有需要油漆的区域,所以为了提高效率我不会打扰' - 或者说,限制油漆的裁剪区域将是空的(没有更新区域)。通过使区域无效,您告诉系统该区域需要重新绘制,因此下一次绘图调用将具有有效的剪辑区域,您将看到更改。 (最好使用带有缓冲区大小的wsprintf_s() - 事实上,因为你似乎使用MFC使用CString和CString :: Format()来代替 - 而且你不应该调用基类OnPaint()(它不起作用,因为当CPaintDC超出范围时它会清除任何更新区域)。