私は、2つのソースイメージ(塗りつぶして塗りつぶしたもの)を使用してプログレスバーを描画するWIN32オーナー描画静的コントロールを持っています。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;
しかし、私は物事を正しく消去して再ペイントすることができないようです。私はWM_PAINTとRedrawWindowでのSendMessageを試したし、どちらもはかなり右に働いています
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を削除する必要があること可能ですか?
コントロール領域をカバーする矩形でInvalidateRect()を呼び出してみましたか? – Rom