CListCtrl. Как получить индекс выделенного элемента?

Модераторы: Romeo, Hawk, Absurd, WinMain, DeeJayC

Ответить
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 12:34
Откуда: Днепропетровск

CListCtrl. Как получить индекс выделенного элемента?

Сообщение Albor » 09 дек 2004, 11:25

Задача такая, по выделению элемента списка кликом мыши нужно получить информацию об этом элементе. Я ввожу обработчик сообщения NM_CLICK, в списке методов класса CListCtrl нашёл ф-цию HitTest, возвращающую нужный мне индекс, но эта ф-ция требует параметр, содержащий координаты точки. Каким образом получить эту точку? В обработчик сообщения этот параметр не передаётся (либо я не знаю каким образом). Возможно я вообще не правильно подхожу к этой задаче? Подскажите пожалуйста.

Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 13:02
Откуда: Минск

Сообщение Kolinus » 09 дек 2004, 11:58

вообще можно у всех айтемов получать стейт и проверять выделен ли он или нет.
также можно получить позицию первого выделенного айтема и потом получать последующих (GetItemState(), GetFirstSelectedItemPosition())
В SAD - все в SAD.

Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 13:02
Откуда: Минск

Сообщение Kolinus » 09 дек 2004, 12:00

к тому же тебе приходит описание айтема по которому ткнули в ентом сообщении
NM_CLICK
lpnmitem = (LPNMITEMACTIVATE) lParam;


typedef struct tagNMITEMACTIVATE{
NMHDR hdr;
int iItem;
int iSubItem;
UINT uNewState;
UINT uOldState;
UINT uChanged;
POINT ptAction;
LPARAM lParam;
UINT uKeyFlags;
} NMITEMACTIVATE, FAR *LPNMITEMACTIVATE;


MSDN
В SAD - все в SAD.

Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 12:34
Откуда: Днепропетровск

Всем спасибо

Сообщение Albor » 13 дек 2004, 12:59

Просто не думал что можно приводить структуру MNHDR к другому типу.

Аватара пользователя
WinMain
Сообщения: 912
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Сообщение WinMain » 18 янв 2005, 12:20

При таком способе тебе постоянно придётся привязываться к сообщению NM_CLICK или LVN_ITEMACTIVATE. Чтобы получить индекс выделенной позиции списка без обработки этих сообщений, есть другой способ:

int nItem = (int)::SendMessage(hWndLV, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0));
где hWndLV - дескриптор (хэндл) окна списка типа ListView.
При этом сам список должен иметь флаг LVS_SINGLESEL (выделение только одной позиции).

Ответить