Уменьшение мерцания ListBox в обработчике OwnerDraw
Автор: Neil
Предположим ListBox имеет в своем списке два элемента, элемент 0 имеет фокус,
активен другой компонент и вы щелкаете на элементе 1. При этом происходит
*ПЯТИКРАТНЫЙ* вызов OnDrawItem, смотрите сами изменения состояний двух
элементов: Index State
0 [odSelected, odFocused]
0 [odSelected]
0 []
1 [odSelected]
1 [odSelected, odFocused]
В случае единственного элемента в списке ListBox получается конфуз,
поскольку при щелчке на нем вы получаете тот же самый сценарий, только вместо
двух индексов присутствует один, нулевой.
Имея эту информацию, вы можете минимизировать количество вызовов процедуры
отрисовки. Для примера, в не-multi-select ListBox, элемент не нужно
отрисовывать, если его состояние = [odSelected], поскольку это состояние всегда
сопровождается НЕ selected НЕ focused, или ОДНОВРЕМЕННО selected и focused. В
этом вам поможет технология отслеживания в обработчике OnDrawItem предыдущего
отрисованного элемента, и если предыдущий запомненный элемент равен текущему, то
отрисовывать его необязательно, например:
...
const
LastIndex: LongInt = -1;
begin
IF Index = LastIndex THEN
...
ELSE
...
LastIndex := Index;
end;
|
|
|
  |
|
Кондиционеры с монтажом и гарант - кондиционеры. Кондиционеры продажа. . шкафы для рабочей одежды . Технология утепления лоджии , завод базальтовой теплоизоляции. Продажа базальтовой теплоизоляции. . Детские деревянные шкафы для верхней одежды для детского сада. Одежда хранение шкаф. . |