我有一個使用兩個源圖像(填充和未填充)繪製進度條的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;
但是,我似乎無法得到正確的擦除和重新繪製的東西。我試過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?
您是否嘗試過使用覆蓋控制區域的矩形調用InvalidateRect()? – Rom