У меня есть список, нарисованный владельцем, в котором я хотел бы нарисовать анимацию некоторого прогресса. Картина того, что я получил, скажет многое, я верю:
Каждый файл добавляется в список при удалении в область DRAG HERE, где создается новый поток и начинается процесс шифрования / дешифрования. Процесс enc / dec сохраняет значение прогресса (в процентах) в заданной переменной того, сколько работы сделано.
По мере того, как прогресс увеличивается на один, я перерисовываю список.
if(progress - prevProgress > 1.0)
{
InvalidateRect(Listbox, &ListboxProgressRect, TRUE);
UpdateWindow(Listbox);
prevProgress = progress;
}
Проблема в том, что каждый элемент перерисовывается, даже если должен быть перерисован только один элемент. ListboxProgressRect
область фактически включает самые правые 40 пикселей списка, умноженные на высоту списка.
Я хотел бы обрабатывать рисунок полностью в WM_PAINT с помощью подкласса Ctrl, но я не знаю, как бы я рисовал элементы и функцию полосы прокрутки. Окно редактирования и кнопка рядом с индикатором хода также подойдут.
Должен ли я создать подкласс списка и обработать весь рисунок? Если так, как я могу нарисовать полосу прокрутки (и заставить ее работать)?
Вы хотите перерисовать только один элемент, поэтому вы должны сделать недействительным только один элемент.
Проблема в том, что вы не знаете, где этот предмет. Список делает. Так спроси это.
послать LB_GETITEMRECT
.
сколько потоков может обработать ваш список? я думаю, что это плохая идея использовать theards. лучше использовать таймер для всего списка, который проверяет состояние каждого видимого элемента и проверяет, должен ли он быть перерисован или нет. используйте InvalidateRect, чтобы заставить WM_PAINT перерисовать список.
потоки просто усложняют ваш код.
Чтобы избежать обработки скробаров рисования, не делайте список подклассов, а вместо этого создайте onwerdrawn listbox, он гибкий и обрабатывает также сглаживание прокрутки.