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);
}
}
}