Привет.
В семерке выделение группы в ListView control'е вызывает выделение всех элементов группы. Возможно ли запретить такое поведение? В XP выделение групп ни на что не влияет, что вполне устраивает.
SVZ>В семерке выделение группы в ListView control'е вызывает выделение всех элементов группы. Возможно ли запретить такое поведение?
Я сам не пробовал, но думаю, для начала стоит убрать стиль LVGS_COLLAPSIBLE у групп. Это можно сделать вызовом
ListView_SetGroupState(). Далее можно попробовать ловить
LVN_ITEMCHANGING и смотреть, пытается ли кто-то в данный момент выделить элементы нажатием на группу. Но это как-то криво, по-моему, вряд ли будет работать стабильно. Более интересный вариант такой: ловить клик мыши по заголовку группы в обработчике
OnMouseDown(), звать
ListView_HitTest() и проверять попадание в группу, если да, то возвращать из обработчика 0, указывая таким образом, что нажатие мы обработали и ничего более делать (тем более, вызывать оригинальный обработчик самого ListView) не требуется. Такие дела.
Здравствуйте, x64, Вы писали:
SVZ>>В семерке выделение группы в ListView control'е вызывает выделение всех элементов группы. Возможно ли запретить такое поведение?
x64>Я сам не пробовал, но думаю, для начала стоит убрать стиль LVGS_COLLAPSIBLE у групп. Это можно сделать вызовом ListView_SetGroupState(). Далее можно попробовать ловить LVN_ITEMCHANGING и смотреть, пытается ли кто-то в данный момент выделить элементы нажатием на группу. Но это как-то криво, по-моему, вряд ли будет работать стабильно. Более интересный вариант такой: ловить клик мыши по заголовку группы в обработчике OnMouseDown(), звать ListView_HitTest() и проверять попадание в группу, если да, то возвращать из обработчика 0, указывая таким образом, что нажатие мы обработали и ничего более делать (тем более, вызывать оригинальный обработчик самого ListView) не требуется. Такие дела.
Увы, не все так гладко.
HitTest поможет в случае мыша, но не сработает, если выделение происходит с помощью клавиатуры.
В LVN_ITEMCHANGED невозможно определить, что выделена именно группа — флаг выделенности у группы выставляется, даже если руками выделить все элементы группы.
Пробовал вариант с проверкой — есть ли у одного из выделенных элементов флаг LVIS_FOCUSED. Оно работает и для мыша, и для клавы, но мля, если выделять с нажатым <CTRL>, то этот флаг не ставится.
В общем, придется списывать в фичи.
Как один из вариантов решения — вводить задержку на обработку смены выделения. При смене выделения перезапускать таймер, а по таймеру реагировать на выделение. Тогда можно будет быстро проскакивать выделение группы.
Пока другого варианта не вижу. Разве что вручную эмулировать группы.