пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Использование элемента управления типа «список». Стили окон списков. Сообщения от элемента управления типа «список» (LBN_). Некоторые методы класса CListBox

Использование элемента управления типа список

Работать со списками сложнее, поскольку реальным объектом список становится тогда, когда диалоговое окно уже выведено на экран. Нельзя вызывать функции-члены списка до тех пор, пока не будет порожден экземпляр класса диалогового окна. Таким образом, инициализировать список – заполнить его элементами-строками – и анализировать, какая строка выбрана, можно только на том участке программы, который выполняется во время присутствия диалогового окна на экране.

Когда наступает время инициализировать диалоговое окно, перед выводом его на экран, вызывается функция-член класса CDialog OnInitDialog(). Для того, чтобы включить эту функцию в члены класса CsdiDialog необходимо воспользоваться услугами ClassWizard.

В окне ClassView щелкнуть правой кнопкой на CsdiDialog  и в контекстном меню выбрать команду Add Windows Message Handler (Добавить обработчик сообщений Windows). На экране появится окно New Message and Event Handlers. В списке New Windows Messages/Events выбрать WM_INITDIALOG и щелкнуть на кнопке Add Handler. Идентификатор сообщений исчезнет из списка в левой части окна и появится в списке Existing Messages/Event Handlers в правой части. Щелкнуть на нем и затем щелкнуть на кнопке EditExisting с тем, чтобы увидеть текст программы.

BOOL CsdiDialog:: OnInitDialog()

(зн )       CDialog::OnInitDialog();

          m_listbox.AddString(“First String”);

          m_listbox.AddString(“Second String”);

          m_listbox.AddString(“Third String”);

          m_listbox.AddString(“Fourth String”);

          m_listbox.SetCurSel(2);

          m_radio=1;

          UpdateData(FALSE);

return TRUE;   //Возвращает TRUE , если только вы не //установили фокус ввода на элемент //управления

Работы этого фрагмента начинается с вызова той версии функции OnInitDialog(), которая принадлежит базовому классу СDialog. Она выполнит все фоновые операции, предусмотренные в MFC, для инициализации диалогового окна. Затем вызывается  функция член AddString , которая добавляет в список элементы. Функция SetCurSel устанавливает начальный фокус выбора в списке. Индекс начинается с нуля.

Для того чтобы организовать вывод в окне сообщения информации о выбранном из списка элементе, нужно также включить специальный член-переменную в класс диалогового окна. В эту переменную при закрытии окна будет записываться значение, к которому затем можно обратиться, несмотря на то, что окно уже закрыто. В окне ClassView правой кнопкой на CsdiDialog и выбрать Add Member Variable. Заполните реквизиты: имя – m_selected; тип – Cstring и щелкните OK. Описание переменной появится в файле заголовка класса диалогового окна. Если планируется, что список должен поддерживать многозначный выбор, то тип введенной переменной будет CstringArray, т.е. эта переменная будет содержать массив выбранных переменных. Член- переменную вообще говоря следует объявлять закрытой (private), а функции доступа к ней открытыми (public). В примере для упрощения объявим public. Эта новая переменная будет хранить выбранный пользователем элемент списка. Запись в нее будет производиться  тогда, когда пользователь щелкает на OK или CANCEL.

Для того, чтобы добавить функцию, которая будет вызываться после щелчка OK, нужно выполнить следующее.

  1. В окне ClassView щелкнуть правой кнопкой на CsdiDialog  и в контекстном меню выбрать команду Add Windows Message Handler (Добавить обработчик сообщений Windows).
  2. В окне New Message and Event Handlers выбрать в списке Class or object to handle IDOK.
  3. В левом списке New Windows Messages/Events выбрать BN_CLICKED. Этим вы выбираете функцию для обработки однократного щелчка на кнопке OK.
  4. щелкнуть на кнопке Add Handler, появится диалоговое окно Add Member Function.
  5. Согласитесь с предложенным именем OnOK(), для чего щелкните на OK.
  6. Щелкните на кнопке EditExisting, появится текст программы. Вставьте в него несколько строк.

Стили окон списков

В окна списка почти всегда включают идентификатор стиля LBS_NOTIFY, что позволяет родительскому окну получать от окна списка сообщение WM_COMMAND.

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

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

По умолчанию, оконная процедура окна списка выводит только список элементов без какой-либо рамки вокруг. Рамку можно добавить с помощью стиля WS_BORDER.

Для прокрутки содержимого с помощью мыши и вертикальной полосы прокрутки следует использовать стиль WS_VSCROLL.

В заголовочных файлах Windows определяется стиль списка, который называется LBS_STANDARD. Стиль LBS_STANDARD включает в себя наиболее часто используемые стили списка. Он определяется как комбинация

(LBS_NOTIFY|LBS_SORT|WS_VSCROLL|WS_BORDER)

Замечание. Также можно пользоваться стилями WS_SIZEBOX и WS_CAPTION, которые дают возможность менять размер окна и перемещать его по рабочей области родительского окна.

Замечание. Когда пользователь щелкает мышью над окном списка, окно списка получает фокус ввода. Если окно списка имеет фокус ввода, то для выбора пунктов можно пользоваться как мышью, так и клавиатурой.

Когда Вы работаете со списком, вырабатываются уведомляющие сообщения (notification) от списка. Вы можете посмотреть все сообщения, которые можете обрабатывать в Message Map, если выберите IDC_list1 списка.

LBN_ERRSPACE - превышен размер памяти, отведенный для списка

LBN_SELCHANGE - изменен текущий выбор (подсветка перемещается по списку);

LBN_DBLCLK - на пункте списка имел место двойной щелчок мышью.

Замечание. Окно списка посылает коды уведомления LBN_SELCHANGE и LBN_DBLCLK только в том случае, если в стиль дочернего окна включен идентификатор LBS_NOTIFY.

LBN_KILLFOCUS - Потеря фокуса

LBN_SELCANCEL - Выбор с элемента снимается

LBN_SETFOCUS - Получение фокуса

Некоторые методы класса CListBox

Метод для очистки содержимое списка, делает его пустым:

void ResetContent();

Метод для добавления элемента в список:

int AddString( LPCSTR lpszItem);

Добавляет строку lpszItem в список и cортирует его, если при создании включено свойство Sort. В противном случае элемент добавляется в конец списка.

Метод для удаления элемента из списка:

int DeleteString( UINT nIndex);

Удаляет из списка элемент с индексом nIndex. Индексация элементов начинается с 0.

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

int GetCurSel() const;

Метод для программной установки отмеченного элемента списка:

int SetCurSel( int nSelect);

Отмечает элемент с индексом nSelect как выбранный элемент списка. Если значение параметра равно -1, список не будет содержать отмеченных элементов.

Методы для копирования содержания определенного элемента в буфер:

int GetText( int nIndex, LPSTR lpszBuffer) const;

или

void GetText( int nIndex, CString& rString) const;

Копирует элемент с индексом nIndex в буфер.

Метод для организации прокрутки списка в окне так, чтобы элемент с индексом nIndex был видимым:

int SetTopIndex( int nIndex);

Метод для организации поиска в списке:

int FindString( int nStartAfter, LPCSTR lpszItem) const;

Организует поиск в списке и возвращает в качестве результата индекс элемента списка, префикс которого совпадает со строкой lpszItem. Результат не зависит от регистра, в котором набирались символы сравниваемых строк.

Параметр nStartAfter задает начало поиска, но поиск идет по всему списку. Он начинается от элемента, следующего за nStartAfter, до конца списка и затем продолжается от начала списка до элемента с индексом nStartAfter. В качестве результата выдается первый найденный элемент, удовлетворяющий условиям поиска. Если такого нет, результат получает значение LB_ERR.

Этот метод отличается от предыдущего тем, что теперь не префикс элемента должен совпадать со строкой lpszFind, а сам текст элемента:

int FindStringExact( int nIndexStart, LPCSTR lpszFind) const;

Поиск по-прежнему не чувствителен к регистру, в котором набираются символы.


18.01.2020; 19:52
хиты: 53
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь