0

変更可能な値を画面に表示したい。次のコードがあります

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() を呼び出そうとしましたが、何も変わりませんでした。なぜか画面が更新されない…

4

1 に答える 1

3

ペイント メッセージを直接送信するのではなく、再ペイントする領域を無効にし (InvalidateRect(&area) )、システムに処理させます。ペイントを送るだけでは、「ペイントが必要な領域はないので、効率化のために気にしません」とシステムが言うため、何も得られません-というか、ペイントを制約するクリップ領域は空になります(更新領域はありません) )。領域を無効にすることで、その領域を再描画する必要があることをシステムに伝えるため、次の描画呼び出しで有効なクリップ領域が得られ、変更が表示されます。

(バッファ サイズで wsprintf_s() を使用することをお勧めします - 実際、MFC を使用しているように見えるので、代わりに CString と CString::Format() を使用します - 基本クラスの OnPaint() を呼び出すべきではありません (効果はありません。 CPaintDC が範囲外になると、更新領域がクリアされるためです)。

于 2012-03-27T10:14:21.247 に答える