Нарисуйте изменяемый текст с CDC :: DrawText - PullRequest
0 голосов
/ 27 марта 2012

Я хочу показать на экране некоторое значение, которое можно изменить. У меня есть следующий код

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 () в конце, но ничего не изменилось. По какой-то причине экран не обновляется ..

1 Ответ

3 голосов
/ 27 марта 2012

Не следует отправлять сообщение рисования напрямую, а вместо этого сделать недействительной область, которую нужно перекрасить (InvalidateRect (& area)), и позволить системе обработать его.Отправляя только краску, вы ничего не получаете, потому что система говорит: «Нет области, которая требует рисования, поэтому для эффективности я не буду беспокоиться» - или, скорее, область клипа, которая ограничивает рисование, будет пустой (нет области обновления).Делая недействительной область, вы сообщаете системе, что эта область нуждается в перерисовке, поэтому следующий вызов рисования будет иметь действительную область обрезки, и вы увидите изменение.

(Лучше использовать wsprintf_s () с размером буфера - фактически, поскольку вы, кажется, используете MFC, используйте взамен CString и CString :: Format () - и вы не должны вызывать базовый класс OnPaint ()(это не имеет никакого эффекта, поскольку, когда CPaintDC выходит из области видимости, он очищает любую область обновления).

...