2012-03-27 43 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超出範圍時它會清除任何更新區域)。