2 つのソース イメージ (塗りつぶしと塗りつぶしなし) を使用してプログレス バーを描画する WIN32 所有者描画の静的コントロールがあります。最初のドローでうまく機能します:
case WM_DRAWITEM:
{
DRAWITEMSTRUCT* draw = (DRAWITEMSTRUCT*)lparam;
// Manually draw the progress bar.
if( draw->hwndItem == hwndProgress )
{
// Progress bar is 526 pixels wide.
int left = progressPercent * 526 / 100;
// Paint sections of window with filled and unfilled bitmaps
// based on progress bar position.
HDC hdcMem = ::CreateCompatibleDC(draw->hDC);
::SelectObject(hdcMem, hBmpProgressFull);
::BitBlt(draw->hDC, 0, 0, left, 36, hdcMem, 0, 0, SRCCOPY);
::DeleteDC(hdcMem);
HDC hdcMem2 = ::CreateCompatibleDC(draw->hDC);
::SelectObject(hdcMem2, hBmpProgressEmpty);
::BitBlt(draw->hDC, left, 0, 526-left, 36, hdcMem2, left, 0, SRCCOPY);
::DeleteDC(hdcMem2);
return TRUE;
}
}
return 0;
しかし、うまく消したり塗り直したりすることができないようです。SendMessage を WM_PAINT と RedrawWindow で試しましたが、どちらもうまくいきませんでした:
bool SetLoginProgressBar(float value)
{
if( hwndProgress != NULL )
{
progressPercent = (int)(value * 100.0);
//::RedrawWindow(hwndProgress, NULL, NULL, RDW_INVALIDATE|RDW_INTERNALPAINT);
::SendMessage(hwndProgress, WM_PAINT, NULL, NULL);
}
return true;
}
新しい値でウィンドウを再描画する代わりに、最初に描画された画像をそこに置き、それ以降の描画コマンドを無視します。0%、50% などの初期値の進行状況を正しく描画し、WM_DRAWITEM メッセージ ハンドラー コードが呼び出されていることを確認できます。
では、WIN32 でこのコントロールに消去と再描画を指示する正しい方法は何ですか?
BeginPaint/EndPaint のようなことをしたり、渡された DRAWITEMSTRUCT の hDC を削除したりする必要がある可能性はありますか?