C ++ Winapi Владелец нарисовал анимацию списка

У меня есть список, нарисованный владельцем, в котором я хотел бы нарисовать анимацию некоторого прогресса. Картина того, что я получил, скажет многое, я верю:

Listbox

Каждый файл добавляется в список при удалении в область DRAG HERE, где создается новый поток и начинается процесс шифрования / дешифрования. Процесс enc / dec сохраняет значение прогресса (в процентах) в заданной переменной того, сколько работы сделано.
По мере того, как прогресс увеличивается на один, я перерисовываю список.

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

Проблема в том, что каждый элемент перерисовывается, даже если должен быть перерисован только один элемент. ListboxProgressRect область фактически включает самые правые 40 пикселей списка, умноженные на высоту списка.

Я хотел бы обрабатывать рисунок полностью в WM_PAINT с помощью подкласса Ctrl, но я не знаю, как бы я рисовал элементы и функцию полосы прокрутки. Окно редактирования и кнопка рядом с индикатором хода также подойдут.

Должен ли я создать подкласс списка и обработать весь рисунок? Если так, как я могу нарисовать полосу прокрутки (и заставить ее работать)?

1

Решение

Вы хотите перерисовать только один элемент, поэтому вы должны сделать недействительным только один элемент.

Проблема в том, что вы не знаете, где этот предмет. Список делает. Так спроси это.

послать LB_GETITEMRECT.

3

Другие решения

сколько потоков может обработать ваш список? я думаю, что это плохая идея использовать theards. лучше использовать таймер для всего списка, который проверяет состояние каждого видимого элемента и проверяет, должен ли он быть перерисован или нет. используйте InvalidateRect, чтобы заставить WM_PAINT перерисовать список.

потоки просто усложняют ваш код.

Чтобы избежать обработки скробаров рисования, не делайте список подклассов, а вместо этого создайте onwerdrawn listbox, он гибкий и обрабатывает также сглаживание прокрутки.

1

По вопросам рекламы [email protected]