C++ Winapi Owner绘制的列表框动画

C++ Winapi Owner drawn listbox animation

我有一个自绘列表框,我想在其中绘制一些进度的动画。我相信一张我到目前为止得到的图片会说明很多问题:

每个文件在拖放到此处时都会添加到列表框中,在此处创建一个新线程并启动 encryption/decryption 进程。 enc/dec 过程将进度值(以百分比表示)保存到给定的变量,表示已完成多少工作。
随着进度增加一个,我正在重绘列表框。

if(progress - prevProgress > 1.0)
{
    InvalidateRect(Listbox, &ListboxProgressRect, TRUE);
    UpdateWindow(Listbox);
    prevProgress = progress;
}

问题是 每个项目都被重绘,即使只有一个项目应该被重绘。 ListboxProgressRect 区域实际上包括最右边的 40 个像素列表框乘以列表框高度。

我想使用子类 Ctrl 在 WM_PAINT 中完全处理绘图,但我不知道如何绘制项目和滚动条功能。 进度条旁边的编辑框和按钮也不错。

我应该将列表框子类化并处理所有绘图吗?如果是这样,我如何绘制滚动条(并使其工作)?

有多少线程可以处理您的列表框?。我想使用 theards 是个坏主意。最好为整个列表框使用一个计时器来检查每个可见元素的状态并检查它是否必须重绘。使用 InvalidateRect 强制 WM_PAINT 重绘列表。

线程只会使您的代码复杂化。

为了避免处理绘图 scrobars,不要子类列表,而是创建一个 onwerdrawn 列表框,它很灵活,也可以处理滚动平滑。

您只想重绘一项,因此您应该只使一项无效。

问题是,您不知道物品在哪里。列表框可以。那就问吧。

发送LB_GETITEMRECT.