0

Windows XP SP3 の Visual Studio 2008 の C++

完了までに時間がかかるループで更新されているダイアログに CProgressCtrl があります。最初は非表示になり、ループのために表示され、完了すると再び非表示になります。

ループ内でdoEvents()、メッセージ キューを処理するメソッドを呼び出します。これにより、フォームを移動するとフォームが再描画され、バーを更新するとプログレスバーボックスが増加することが保証されますSetPos()

プログレスバーを初めて使用するときは、正常に機能します。ただし、その後の使用では、バーは境界線なしで表示され、ボックスが増加しても境界線は再描画されません (これらは引き続き正しく描画されます)。

プログレスバーの境界線を強制的に (再) 描画するにはどうすればよいですか? 試してみましたがInvalidate()、どれも違いはありません。UpdateWindow()RedrawWindow()

興味深いことに、ループの実行中にダイアログを画面外にドラッグして再び戻すと、境界線がすぐに再描画されます。

関連する場合に備えて、doEvents()私が使用している方法を次に示します(ここから取得)

void MyClass::doEvents()
{
    MSG msg;
    BOOL result;

    while ( ::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE ) )
    {
        result = ::GetMessage(&msg, NULL, 0, 0);
        if (result == 0) // WM_QUIT
        {                
            ::PostQuitMessage(msg.wParam);
            break;
        }
        else if (result == -1)
        {
             // Handle errors/exit application, etc.
        }
        else 
        {
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
        }
    }
}
4

0 に答える 0