logo search
Конспект по ООПиП ч

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

Работать со списками сложнее, поскольку реальным объектом список становится тогда, когда диалоговое окно уже выведено на экран. Нельзя вызывать функции-члены списка до тех пор, пока не будет порожден экземпляр класса диалогового окна. Таким образом, инициализировать список – заполнить его элементами-строками – и анализировать, какая строка выбрана, можно только на том участке программы, который выполняется во время присутствия диалогового окна на экране. Когда наступает время инициализировать диалоговое окно, перед выводом его на экран, вызывается функция-член класса CDialog OnInitDialog(). Для того, чтобы включить эту функцию в члены класса C<Имя>Dialog необходимо воспользоваться услугами ClassWizard. В окне ClassView щелкнуть правой кнопкой на C<Имя>Dialog и в контекстном меню выбрать команду Add Windows Message Handler (Добавить обработчик сообщений Windows). На экране появится окно New Message and Event Handlers. В списке New Windows Messages/Events выбрать WM_INITDIALOG и щелкнуть на кнопке Add Handler. Идентификатор сообщений исчезнет из списка в левой части окна и появится в списке Existing Messages/Event Handlers в правой части. Щелкнуть на нем и затем щелкнуть на кнопке EditExisting с тем, чтобы увидеть текст программы.

BOOL C<Имя>Dialog:: OnInitDialog()

{ CDialog::OnInitDialog();

m_listbox.AddString(“First String”);

m_listbox.AddString(“Second String”);

m_listbox.SetCurSel(2);

m_radio=1;

UpdateData(FALSE);

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

Работы этого фрагмента начинается с вызова той версии функции OnInitDialog(), которая принадлежит базовому классу СDialog. Она выполнит все фоновые операции, предусмотренные в MFC, для инициализации диалогового окна. Затем вызывается функция член AddString , которая добавляет в список элементы. Функция SetCurSel устанавливает начальный фокус выбора в списке. Индекс начинается с нуля. Для того чтобы организовать вывод в окне сообщения информации о выбранном из списка элементе, нужно также включить специальный член-переменную в класс диалогового окна. В эту переменную при закрытии окна будет записываться значение, к которому затем можно обратиться, несмотря на то, что окно уже закрыто. В окне ClassView правой кнопкой на C<Имя>Dialog и выбрать Add Member Variable. Заполните реквизиты: имя – m_selected; тип – CString и щелкните OK. Описание переменной появится в файле заголовка класса диалогового окна. Если планируется, что список должен поддерживать многозначный выбор, то тип введенной переменной будет CStringArray, т.е. эта переменная будет содержать массив выбранных переменных. Член-переменную следует объявлять закрытой (private), а функции доступа к ней открытыми (public). В примере для упрощения объявим public. Эта новая переменная будет хранить выбранный пользователем элемент списка. Запись в нее будет производиться тогда, когда пользователь щелкает на OK или CANCEL. Для того чтобы добавить функцию, которая будет вызываться после щелчка OK, нужно в окне ClassView щелкнуть правой кнопкой на C<Имя>Dialog и в контекстном меню выбрать команду Add Windows Message Handler (Добавить обработчик сообщений Windows). В окне New Message and Event Handlers выбрать в списке Class or object to handle IDOK. В левом списке New Windows Messages/Events выбрать BN_CLICKED. Этим вы выбираете функцию для обработки однократного щелчка на кнопке OK. Щелкнуть на кнопке Add Handler, появится диалоговое окно Add Member Function. Согласитесь с предложенным именем OnOK(), для чего щелкните на OK. Щелкните на кнопке EditExisting, появится текст программы.

Создание обработчиков событий нажатия на кнопки OK и CANCEL. Простейшим событием является нажатие на кнопку в диалоге. Для его создания можно просто дважды нажать левой клавишей мыши в окне ресурса по соответствующей кнопке. После этого на экране появится диалог. По умолчанию ClassWizard предлагает очень удачное имя для этой функции обработки события. Листинг: <Имя>DIALOG.СРР , функция C<Имя>Dialog::OnOK():

void CSDIDialog::OnOK()

{ int index = m_list.GetCurSel();

if (index != LB_ERR) { m_list.GetText(index, m_selected);}

else { m_selected = ""; }

CDialog::OnOK(); }

Работа этого фрагмента программы начинается с вызова функции-члена класса объектов список GetCurSel(), которая возвращает константу LB_ERR в случае, если не выбран ни один элемент списка или если выбрано более одного элемента. Иначе возвращается индекс выбранного элемента. Функция GetText() (член того же класса) переписывает строку выбранного элемента в переменную m_selected класса C<Имя>Dialog. Первым аргументом функции является индекс выбранного элемента. После этого вызывается функция ОnОК() базового класса CDialog, которая выполняет все стандартные действия по закрытию окна.

Сейчас можно скорректировать текст функции C<Имя>App::InitInstance() для того, чтобы в выведенном после закрытия окна сообщении было упомянуто, какой выбор сделал пользователь в списке. Эти строки программы будут выполняться независимо от того, каким образом было закрыто окно – нажал пользователь на ОК или на Cancel. Сначала нужно создать дополнительно функцию, которая обрабатывала бы щелчок на Cancel. Такая функция – OnCancel() – создается точно таким же образом, как и ОnОК(), но в правом списке Class or object to handle выделите IDCANCEL и согласитесь с именем функции OnCancel() Как видно из листинга сформированной функции, переменная m_selected очищается, поскольку пользователь отказался от диалога с программой.

Листинг: <Имя>DIALOG.СРР, функция C<Имя>Dialog::OnCancel():

void CSDIDialog::OnCanceI()

{ m_selected = ""; CDialog::OnCancel(); }