Есть список ListCtrl. Хочу, чтобы определённые строки в нём не выбирались ни клавиатурой, ни мышью, т.е. если курсор попадает на такую строку, то он перескакивает на соседнюю строку. Назовём такие строки заблокированными.
Я побовал ловить LVN_ITEMCHANGED при попадании на заблокированную строку и при помощи SetItemState(n, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED) переходить на другую строку. С клавиатурой всё работает нормально, а вот с мышью нет.
При работе с мышью происходит слудующее:
1. после клика на заблокированную строку она выбирается (устанавливаются флаги LVIS_SELECTED|LVIS_FOCUSED)
2. потом эти флаги по очереди снимаются
3. устанавливаются флаги LVIS_SELECTED|LVIS_FOCUSED для соседней строки
4. и потом, непонятно почему, снимается флаг LVIS_SELECTED у соседней строки, т.е. фокус на ней есть, а подсветки нет.
Если не ставить прерывания, то видно, что выбор соседней строки происходит при нажатии левой клавиши мыши (выделяется соседняя строка), а снятие выделения при отпускании клавиши.
Строки выбираются только по одной.
Так почему же снимается выделение?
В догонку ещё один вопрос.
Все эти заблокированные строки я сделал для того, чтобы разбить таблицу как бы на разделы, не делая несколько разных таблиц.
Может есть какой-нибудь иной способ?
Заранее большое спасибо.
Здравствуйте, cipher, Вы писали:
C>Есть список ListCtrl. Хочу, чтобы определённые строки в нём не выбирались ни клавиатурой, ни мышью, т.е. если курсор попадает на такую строку, то он перескакивает на соседнюю строку. Назовём такие строки заблокированными.
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>Здравствуйте, cipher, Вы писали:
C>>Есть список ListCtrl. Хочу, чтобы определённые строки в нём не выбирались ни клавиатурой, ни мышью, т.е. если курсор попадает на такую строку, то он перескакивает на соседнюю строку. Назовём такие строки заблокированными.
SDB>LVN_ITEMCHANGING не пробовали?
Здравствуйте, cipher, Вы писали:
C>Есть список ListCtrl. Хочу, чтобы определённые строки в нём не выбирались ни клавиатурой, ни мышью, т.е. если курсор попадает на такую строку, то он перескакивает на соседнюю строку. Назовём такие строки заблокированными. C>Я побовал ловить LVN_ITEMCHANGED при попадании на заблокированную строку и при помощи SetItemState(n, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED) переходить на другую строку. С клавиатурой всё работает нормально, а вот с мышью нет. C>При работе с мышью происходит слудующее: C>1. после клика на заблокированную строку она выбирается (устанавливаются флаги LVIS_SELECTED|LVIS_FOCUSED) C>2. потом эти флаги по очереди снимаются C>3. устанавливаются флаги LVIS_SELECTED|LVIS_FOCUSED для соседней строки C>4. и потом, непонятно почему, снимается флаг LVIS_SELECTED у соседней строки, т.е. фокус на ней есть, а подсветки нет. C>Если не ставить прерывания, то видно, что выбор соседней строки происходит при нажатии левой клавиши мыши (выделяется соседняя строка), а снятие выделения при отпускании клавиши. C>Строки выбираются только по одной. C>Так почему же снимается выделение? C>В догонку ещё один вопрос. C>Все эти заблокированные строки я сделал для того, чтобы разбить таблицу как бы на разделы, не делая несколько разных таблиц. C>Может есть какой-нибудь иной способ? C>Заранее большое спасибо.
Может просто перехватывать сообщения мыши?
И те сообщения, которые "хотят кликнуть" (так назовём этот процесс ) на заблокированую строчку просто отсекаем, не передавая их контролу(как бы и не кликали)...
Здравствуйте, Offsider, Вы писали:
O>Здравствуйте, cipher, Вы писали:
C>>Есть список ListCtrl. Хочу, чтобы определённые строки в нём не выбирались ни клавиатурой, ни мышью, т.е. если курсор попадает на такую строку, то он перескакивает на соседнюю строку. Назовём такие строки заблокированными. C>>Я побовал ловить LVN_ITEMCHANGED при попадании на заблокированную строку и при помощи SetItemState(n, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED) переходить на другую строку. С клавиатурой всё работает нормально, а вот с мышью нет. C>>При работе с мышью происходит слудующее: C>>1. после клика на заблокированную строку она выбирается (устанавливаются флаги LVIS_SELECTED|LVIS_FOCUSED) C>>2. потом эти флаги по очереди снимаются C>>3. устанавливаются флаги LVIS_SELECTED|LVIS_FOCUSED для соседней строки C>>4. и потом, непонятно почему, снимается флаг LVIS_SELECTED у соседней строки, т.е. фокус на ней есть, а подсветки нет. C>>Если не ставить прерывания, то видно, что выбор соседней строки происходит при нажатии левой клавиши мыши (выделяется соседняя строка), а снятие выделения при отпускании клавиши. C>>Строки выбираются только по одной. C>>Так почему же снимается выделение? C>>В догонку ещё один вопрос. C>>Все эти заблокированные строки я сделал для того, чтобы разбить таблицу как бы на разделы, не делая несколько разных таблиц. C>>Может есть какой-нибудь иной способ? C>>Заранее большое спасибо.
O>Может просто перехватывать сообщения мыши? O>И те сообщения, которые "хотят кликнуть" (так назовём этот процесс ) на заблокированую строчку просто отсекаем, не передавая их контролу(как бы и не кликали)...
подскажите, как мне это сделать, а именно игнорировать выбор определённой строки. NM_CLICK — позволяет только узнать, что на строку кликнули.
C>подскажите, как мне это сделать, а именно игнорировать выбор определённой строки. NM_CLICK — позволяет только узнать, что на строку кликнули.
Сходу могу предложить попробовать унаследовать свой собственный класс от CListCtrl (CMyListCtrl на пример) и там уже перехватывать сообщения мышки.
Сам принцип я думаю понятен...
Здравствуйте, Offsider, Вы писали:
O>Здравствуйте, cipher, Вы писали:
C>>подскажите, как мне это сделать, а именно игнорировать выбор определённой строки. NM_CLICK — позволяет только узнать, что на строку кликнули.
O>Сходу могу предложить попробовать унаследовать свой собственный класс от CListCtrl (CMyListCtrl на пример) и там уже перехватывать сообщения мышки. O>Сам принцип я думаю понятен...
Принцип понятен, вот способ увы пока не известен. Что ж будем искать.
Спасибо
Здравствуйте, cipher, Вы писали:
C>Здравствуйте, Offsider, Вы писали:
O>>Здравствуйте, cipher, Вы писали:
C>>>подскажите, как мне это сделать, а именно игнорировать выбор определённой строки. NM_CLICK — позволяет только узнать, что на строку кликнули.
O>>Сходу могу предложить попробовать унаследовать свой собственный класс от CListCtrl (CMyListCtrl на пример) и там уже перехватывать сообщения мышки. O>>Сам принцип я думаю понятен...
C>Принцип понятен, вот способ увы пока не известен. Что ж будем искать. C>Спасибо
Доброго !
На какую именно строку кликнули тоже можно узнать, и даже мышиние координаты .А что еще надо для запрещения айтема?
Здравствуйте, Brick_1, Вы писали:
B_>Здравствуйте, cipher, Вы писали:
C>>Здравствуйте, Offsider, Вы писали:
O>>>Здравствуйте, cipher, Вы писали:
C>>>>подскажите, как мне это сделать, а именно игнорировать выбор определённой строки. NM_CLICK — позволяет только узнать, что на строку кликнули.
O>>>Сходу могу предложить попробовать унаследовать свой собственный класс от CListCtrl (CMyListCtrl на пример) и там уже перехватывать сообщения мышки. O>>>Сам принцип я думаю понятен...
C>>Принцип понятен, вот способ увы пока не известен. Что ж будем искать. C>>Спасибо
B_>Доброго ! B_>На какую именно строку кликнули тоже можно узнать, и даже мышиние координаты .А что еще надо для запрещения айтема?
B_>void CMyListCtrl::OnClick(NMHDR* pNMHDR,LRESULT* pResult) B_>{ B_>LPNMITEMACTIVATE pItemActivate=(LPNMITEMACTIVATE)pNMHDR;
B_>pItemActivate->iItem; // То что надо
B_>*pResult=0; B_>}
B_>С уважением.
Спасибо
И всё-таки, как узнать номер кликнутой строки я знал, но я не знаю как вмешаться и отменить действие.
Пробовал на NM_CLICK ловить сообщение ON_NOTIFY_REFLECT_EX
и возвращать TRUE для нужных строк, но NM_CLICK появляется после NM_ITEMCHANGING, поэтому я не смог отменить клик.