Операционная система Windows 95 для программиста



    d8ef8794     

Выбор из списка - часть 2


/p>

Приведем возможные значения флагов состояния:

Флаг состояния Состояние элемента
LVNI_CUT LVIS_CUT отмечен для удаления и последующей вставки
LVNI_DROPHILITED LVIS_DROPHILITED выделен как целевой элемент для операции перемещения "drag and drop"
LVNI_FOCUSED LVIS_FOCUSED элемент имеет фокус ввода
LVNI_SELECTED LVIS_SELECTED элемент выделен

Для поиска выделенных элементов вам нужно использовать флаг состояния LVNI_SELECTED и флаг расположения LVNI_ALL.

В нашем приложении List Application мы выполняем выбор элемента двойным щелчком левой клавишей мыши по пиктограмме или строке названия элемента.

Как это можно осуществить?

Извещение NM_DBLCLK

Когда пользователь делает двойной щелчок левой клавишей мыши внутри окна органа управления List View, родительское окно получает сообщение WM_NOTIFY с кодом извещения NM_DBLCLK. Обработчик этого извещения может определить номер выделенного элемента с помощью макрокоманды ListView_GetNextItem , как это сделано в приведенном ниже фрагменте кода:

case NM_DBLCLK: { int index; LV_ITEM lvi; char szBuf[256]; strcpy(szBuf, "Selected item:\n");

index = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED); if(index == -1) return 0;

memset(&lvi, 0, sizeof(lvi)); lvi.mask = LVIF_TEXT;

lvi.iItem = index; lvi.iSubItem = 0; ListView_GetItem(hwndList, &lvi); strcat(szBuf, lvi.pszText);

lvi.iItem = index; lvi.iSubItem = 1; ListView_GetItem(hwndList, &lvi); strcat(szBuf, " : "); strcat(szBuf, lvi.pszText);

lvi.iItem = index; lvi.iSubItem = 2; ListView_GetItem(hwndList, &lvi); strcat(szBuf, " : $"); strcat(szBuf, lvi.pszText);

MessageBox(hWnd, szBuf, szAppName, MB_OK); return 0L; break; }

Если пользователь сделал двойной щелчок там, где нет пиктограммы или строки названия элемента, макрокоманда ListView_GetNextItem вернет значение -1. В этом случае обработчик извещения NM_DBLCLK завершает свою работу, так как пользователь не выбрал ни одного элемента.

Если же выбор сделан, обработчик извещения получает текстовую информацию о выделенном элементе списка с помощью макрокоманды ListView_GetItem. Эта макрокоманда заполняет поля структуры LV_ITEM, отмеченные в поле mask. Макрокоманда вызывается несколько раз - для основного и всех дополнительных элементов.




Содержание  Назад