gpt4 book ai didi

c++ - WIN32 : How Do I Tell an Owner Drawn Static Control to Refresh Itself?

转载 作者:太空宇宙 更新时间:2023-11-04 14:57:26 24 4
gpt4 key购买 nike

我有一个 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 发送消息,但没有一个工作得很好:

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?

最佳答案

在销毁 DC 之前,您并没有从内存 DC 中取消选择位图。也许位图处于 Windows 不允许您再次选择它们的状态,因此 BitBlts 失败。

附言RedrawWindow 是我在这种情况下使用的。 InvalidateRect 也有效,但前提是您的消息循环正在运行。这引出了另一个观察结果:如果您正在进行长时间运行的操作,您可能无法返回到消息循环并且您的应用程序将看起来已挂起,包括进度窗口的更新。

关于c++ - WIN32 : How Do I Tell an Owner Drawn Static Control to Refresh Itself?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6471712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com