Выбор строки в ListCtrl
От: cipher  
Дата: 07.01.04 12:41
Оценка:
Есть список 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 у соседней строки, т.е. фокус на ней есть, а подсветки нет.
Если не ставить прерывания, то видно, что выбор соседней строки происходит при нажатии левой клавиши мыши (выделяется соседняя строка), а снятие выделения при отпускании клавиши.
Строки выбираются только по одной.
Так почему же снимается выделение?
В догонку ещё один вопрос.
Все эти заблокированные строки я сделал для того, чтобы разбить таблицу как бы на разделы, не делая несколько разных таблиц.
Может есть какой-нибудь иной способ?
Заранее большое спасибо.
Re: Выбор строки в ListCtrl
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 07.01.04 16:32
Оценка:
Здравствуйте, cipher, Вы писали:

C>Есть список ListCtrl. Хочу, чтобы определённые строки в нём не выбирались ни клавиатурой, ни мышью, т.е. если курсор попадает на такую строку, то он перескакивает на соседнюю строку. Назовём такие строки заблокированными.


LVN_ITEMCHANGING не пробовали?
<< RSDN@Home 1.1.0 stable >>
- Искренне ваш, Поросенок Пафнутий
Re[2]: Выбор строки в ListCtrl
От: cipher  
Дата: 07.01.04 20:15
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, cipher, Вы писали:


C>>Есть список ListCtrl. Хочу, чтобы определённые строки в нём не выбирались ни клавиатурой, ни мышью, т.е. если курсор попадает на такую строку, то он перескакивает на соседнюю строку. Назовём такие строки заблокированными.


SDB>LVN_ITEMCHANGING не пробовали?


Пробовал, но происходило то же самое.
Re: Выбор строки в ListCtrl
От: Offsider Украина  
Дата: 08.01.04 01:14
Оценка:
Здравствуйте, 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>Заранее большое спасибо.

Может просто перехватывать сообщения мыши?
И те сообщения, которые "хотят кликнуть" (так назовём этот процесс ) на заблокированую строчку просто отсекаем, не передавая их контролу(как бы и не кликали)...
... << RSDN@Home 1.1 beta 2 >>
__________________________________________________________ :)
Compiling...
message.cpp(4):error C2059: Can't understand russian mat :'@#$^& '
Re[2]: Выбор строки в ListCtrl
От: cipher  
Дата: 08.01.04 15:55
Оценка:
Здравствуйте, 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 — позволяет только узнать, что на строку кликнули.
Re[3]: Выбор строки в ListCtrl
От: Offsider Украина  
Дата: 08.01.04 17:54
Оценка:
Здравствуйте, cipher, Вы писали:


C>подскажите, как мне это сделать, а именно игнорировать выбор определённой строки. NM_CLICK — позволяет только узнать, что на строку кликнули.


Сходу могу предложить попробовать унаследовать свой собственный класс от CListCtrl (CMyListCtrl на пример) и там уже перехватывать сообщения мышки.
Сам принцип я думаю понятен...
... << RSDN@Home 1.1 beta 2 >>
__________________________________________________________ :)
Compiling...
message.cpp(4):error C2059: Can't understand russian mat :'@#$^& '
Re[4]: Выбор строки в ListCtrl
От: cipher  
Дата: 08.01.04 20:33
Оценка:
Здравствуйте, Offsider, Вы писали:

O>Здравствуйте, cipher, Вы писали:



C>>подскажите, как мне это сделать, а именно игнорировать выбор определённой строки. NM_CLICK — позволяет только узнать, что на строку кликнули.


O>Сходу могу предложить попробовать унаследовать свой собственный класс от CListCtrl (CMyListCtrl на пример) и там уже перехватывать сообщения мышки.

O>Сам принцип я думаю понятен...

Принцип понятен, вот способ увы пока не известен. Что ж будем искать.
Спасибо
Re[5]: Выбор строки в ListCtrl
От: Brick_1 Украина  
Дата: 09.01.04 06:58
Оценка:
Здравствуйте, cipher, Вы писали:

C>Здравствуйте, Offsider, Вы писали:


O>>Здравствуйте, cipher, Вы писали:



C>>>подскажите, как мне это сделать, а именно игнорировать выбор определённой строки. NM_CLICK — позволяет только узнать, что на строку кликнули.


O>>Сходу могу предложить попробовать унаследовать свой собственный класс от CListCtrl (CMyListCtrl на пример) и там уже перехватывать сообщения мышки.

O>>Сам принцип я думаю понятен...

C>Принцип понятен, вот способ увы пока не известен. Что ж будем искать.

C>Спасибо

Доброго !
На какую именно строку кликнули тоже можно узнать, и даже мышиние координаты .А что еще надо для запрещения айтема?

void CMyListCtrl::OnClick(NMHDR* pNMHDR,LRESULT* pResult)
{
LPNMITEMACTIVATE pItemActivate=(LPNMITEMACTIVATE)pNMHDR;

pItemActivate->iItem; // То что надо

*pResult=0;
}


С уважением.
Re[6]: Выбор строки в ListCtrl
От: cipher  
Дата: 09.01.04 08:58
Оценка:
Здравствуйте, 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, поэтому я не смог отменить клик.
Re[7]: Выбор строки в ListCtrl
От: Brick_1 Украина  
Дата: 09.01.04 09:36
Оценка:
Здравствуйте, cipher, Вы писали:

Доброго !
Вот сделал.

#define WM_SELNEXTITEM (WM_USER+1)


void CNewDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
if(pNMLV->hdr.hwndFrom==c_List.m_hWnd && pNMLV->iItem!=-1 && (pNMLV->uNewState==1 || pNMLV->uNewState==3))
{
if(pNMLV->iItem==0) // Отменить установку на 0-й айтем для примера
{
PostMessage(WM_SELNEXTITEM);
}

}


*pResult = 0;
}

LRESULT CNewDlg::OnSelNext(WPARAM,LPARAM)
{
c_List.SetItemState(1,LVIS_FOCUSED,LVIS_FOCUSED);
c_List.SetItemState(1,LVIS_SELECTED,LVIS_SELECTED);
c_List.EnsureVisible(1,FALSE);
return 0;
}

void CNewDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pItemActivate=(LPNMITEMACTIVATE)pNMHDR;
if(pItemActivate->iItem==0) // Отменить установку на 0-й айтем для примера

{
PostMessage(WM_SELNEXTITEM);
}
*pResult = 0;
}


В WPARAM, LPARAM можно передать че-нить
С уважением.
Re[8]: Выбор строки в ListCtrl
От: cipher  
Дата: 09.01.04 12:13
Оценка:
Здравствуйте, Brick_1, Вы писали:

B_>Здравствуйте, cipher, Вы писали:


B_>Доброго !

B_>Вот сделал.

B_>#define WM_SELNEXTITEM (WM_USER+1)



B_>void CNewDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)

B_>{
B_> LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
B_> if(pNMLV->hdr.hwndFrom==c_List.m_hWnd && pNMLV->iItem!=-1 && (pNMLV->uNewState==1 || pNMLV->uNewState==3))
B_> {
B_> if(pNMLV->iItem==0) // Отменить установку на 0-й айтем для примера
B_> {
B_> PostMessage(WM_SELNEXTITEM);
B_> }
B_> }


B_> *pResult = 0;

B_>}

B_>LRESULT CNewDlg::OnSelNext(WPARAM,LPARAM)

B_>{
B_> c_List.SetItemState(1,LVIS_FOCUSED,LVIS_FOCUSED);
B_> c_List.SetItemState(1,LVIS_SELECTED,LVIS_SELECTED);
B_> c_List.EnsureVisible(1,FALSE);
B_>return 0;
B_>}

B_>void CNewDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)

B_>{
B_>LPNMITEMACTIVATE pItemActivate=(LPNMITEMACTIVATE)pNMHDR;
B_> if(pItemActivate->iItem==0) // Отменить установку на 0-й айтем для примера

B_> {

B_> PostMessage(WM_SELNEXTITEM);
B_> }
B_>*pResult = 0;
B_>}


B_>В WPARAM, LPARAM можно передать че-нить

B_>С уважением.

Огромное Человеческое Спасибо !!!
Всё получилось.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.