2012-03-27 1 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가 범위를 벗어나면 업데이트 영역이 지워지기 때문에 아무런 효과가 없습니다.)