C ++ Winapi所有者绘制的列表框动画

时间:2015-10-13 17:28:44

标签: c++ winapi listbox ownerdrawn

我有一个所有者绘制的列表框,我想在其中绘制一些进展动画。到目前为止我所得到的一张照片将说明我相信的很多:

Listbox

将每个文件放在DRAG HERE区域时添加到列表框中,在该区域创建新线程并启动加密/解密过程。 enc / dec过程将进度值(百分比)保存到给定的变量,即完成了多少工作 随着进度的增长,我正在重新绘制列表框。

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

问题是每个项目都会重新绘制,即使只有一个项目需要重新绘制。 ListboxProgressRect区域实际上包含列表框最右边40个像素的列表框高度

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

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

2 个答案:

答案 0 :(得分:3)

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

麻烦的是,你不知道该项目在哪里。列表框的确如此。所以问问吧。

发送LB_GETITEMRECT

答案 1 :(得分:1)

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

线程只会使代码复杂化。

要避免处理绘图scrobars,不要子类列表,而是创建一个onwerdrawn列表框,它是灵活的,并处理滚动平滑。