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

  d8ef8794     

Выбор из списка


Как правило, список нужен не только для просмотра, но и для того чтобы сделать из него выбор одного или нескольких элементов.

Прежде чем выбрать элементы из списка, пользователь вначале должен их выделить. Один элемент списка можно выделить, щелкнув по нему левой клавишей мыши. Для того чтобы выделить несколько элементов, можно дополнительно воспользоваться клавишами <Shift> и <Control>. В первом случае будет выделен непрерывный диапазон элементов, во втором - любой набор элементов (на обязательно расположенных рядом).

Если окно органа управления List View создано внутри диалоговой панели, после выделения нужных элементов пользователь может нажать кнопку, подтверждающую выбор. В том случае, когда выбирается только один элемент, можно предоставить возможность выбора с помощью двойного щелчка левой клавишей мыши по изображению пиктограммы или по строке названия нужного элемента.

В любом случае у программиста возникает необходимость организовать поиск в списке выделенных элементов. Это можно сделать с помощью макрокоманды ListView_GetNextItem , посылающей окну органа управления List View сообщение LVM_GETNEXTITEM :

int ListView_GetNextItem( HWND hwnd, // идентификатор органа List View int iStart, // номер элемента, с которого начинается поиск UINT flags); // условие поиска

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

Условие поиска задается в виде флагов, определяющих геометрическое расположение элементов, участвующих в поиске, и флагов, определяющих состояние элемента.

В первом наборе определено пять флагов:



Флаг расположения Расположение элементов, участвующих в поиске
LVNI_ABOVE Выше указанного
LVNI_ALL Поиск выполняется во всех элементах (это значение используется по умолчанию)
LVNI_BELOW Ниже указанного
LVNI_TOLEFT Слева от указанного
LVNI_TORIGHT Справа от указанного
<
Приведем возможные значения флагов состояния:

Флаг состояния Состояние элемента
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. Макрокоманда вызывается несколько раз - для основного и всех дополнительных элементов.


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