Лабораторная работа №13 по VisualC++ 2005
"Работа со списками при программировании на C++ стандарта ISO/ANSI"
Составил доц. Авраменко В.В.
1 Постановка задачи
Создать список с дюжиной строк в диалоговом окне. Размеры окна сделать такими, чтобы все строки не поместились в окне списка. В результате справа от него будет находиться полоса прокрутки. При двойном щелчке на одной из строк её содержание должно появляться в текстовом окне.
2 Общие указания
Управляющие элементы можно отображать и в обычном (недиалоговом) окне. Но в этом случае вы не сможете пользоваться редактором диалоговых окон для их создания и размещения. Например, чтобы включить в окно список, Вам придется самостоятельно делать всё, что обычно делает мастер Class Wizard,- редактировать схемы сообщений, задавать идентификаторы ресурсов и т.д.
2.1 Последовательность действий при создании приложения
1)
Start Page.
Create:Project.
Выбрать тип проекта (Project Types) MFC, шаблон- MFC Application,
Name-list1.
2) В окне Application Type выбрать Dialog based. Снять флажок Use Unicode Libraries. Щёлкнуть на Finish.
3) Выбрать вкладку Resource View (Просмотр ресурсов). Раскрыть папку Dialog . Дважды щелкнуть на IDD_LIST1 _DIALOG. Появится диалоговое окно. Вытереть в нем текст TODO…….
4) В диалоговом окне из Toolbox разместить управляющие элементы: List Box (список) и ab| Edit Control (текстовое окно). Над списком разместить надпись «Двічі клацніть по рядку», а над текстовым окном- «Ви вибрали».
5) В класс Clist1Dlg добавим элементы данных , соответствующие списку и текстовому окну. Как обычно, надо в диалоговом окне выделить список, вызвать контекстное меню, выбрать в нем Add Variable. В появившемся окне установить доступ private, тип по умолчанию CListBox, имя даем m_list1. Для текстового окна введем private CEdit m_edit1.
6) Добавить в список строки, из которых предстоит выбирать пользователю. Инициализация данных диалогового окна выполняется в методе OnInitDialog() класса Clist1Dlg. В этом методе мы должны заполнить список строками, чтобы к моменту отображения диалогового окна он содержал необходимую информацию. Конкретно занесем 12 строк «Студент 01», «Студент 02» и т.д. При этом воспользуемся методом AddString() класса CListBox. Ниже приведена часть этого метода, где отображена инициализация строк.
. BOOL Clist1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_list1.AddString("Студент 01");
m_list1.AddString("Студент 02");
m_list1.AddString("Студент 03");
m_list1.AddString("Студент 04");
m_list1.AddString("Студент 05");
m_list1.AddString("Студент 06");
m_list1.AddString("Студент 07");
m_list1.AddString("Студент 08");
m_list1.AddString("Студент 09");
m_list1.AddString("Студент 10");
m_list1.AddString("Студент 11");
m_list1.AddString("Студент 12");
// Add "About..." menu item to system menu.
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
return TRUE; // return TRUE unless you set the focus to a control
}
Возможно возникнет вопрос- почему мы используем запись «Студент 01» вместо «Студент 1». Дело в том, что строки списка по умолчанию сортируются в алфавитном порядке. Следовательно, если во вторую строку занести «Студент 2», то строка «Студент 12» оказалась бы в списке перед ней.Если вы не хотите сортировать, щелкните правой кнопкой мыши в редакторе диалоговых окон, выберите из контекстного меню команду properties, перейдите на вкладку Sort и в открывшемся окне вместо true установите false. Заносимые в список строки автоматически нумеруются, и в дальнейшем к ним можно обращаться по индексу. Первая строка имеет индекс 0, вторая- 1 и т.д.Если в программе запросить у объекта списка выбранную пользователем строку, он возвращает индекс этой строки. Инициализация завершена.
7) Теперь необходимо создать обработчик двойных щелчков. По условию на выбранной строке нужно дважды щелкнуть левой кнопкой мышки. При этом строка отобразится в текстовом окне.Поскольку выделение строки происходит в списке, выделим его окно, вызовем контекстное меню, выберем properties.В верхней части окна щелкнуть по окну Control Events (помечен символом «молнии»). В открывшемся списке обрабатываемых событий выбираем LBN_DBLCLK.В появившемся окошке нужно раскрыть список. В нем выбрать строку <Add>OnLbnDblclkList1 и щелкнуть по ней. В результате в файле list1.cpp появится заготовка для обработчика двойных щелчков в списке.Ниже приведен текст обработчика двойных щелчков.
void Clist1Dlg::OnLbnDblclkList1()
{
CString text;
m_list1.GetText(m_list1.GetCurSel(),text);
m_edit1.SetWindowTextA(text);
UpdateData(false);
// TODO: Add your control notification handler code here
}
Здесь функция GetCurSel()класса CListBox получает индекс выбранной строки а GetText() этого же класса копирует строку списка в буфер (локальная переменная CString text). Затем метод SetWindowTextA() класса CEdit выводит содержимое text в текстовое окно. При этом нужно помнить, что параметр false функции () означает UpdateData() ввод в окно.
Программа составлена и её можно запустить нажав Ctrl+F5.
3 Контрольные вопросы
1 Как создать диалоговое окно?
2 Какого класса список и как его создать класс ?
3 Как осуществить инициализацию списка ?
4 Зачем нужно создавать локальную переменную типа CString в обработчике двойных щелчков?
5 Зачем нужны функции GetText() и GetCursel(), какого они класса?
6 Рассказать как работает обработчик двойных щелчков.
7 Для чего служит функция UpdateData(), какие значения принимает её параметр и что они означают?
8 Чем список отличается от текстового окна?
9 Почему в списке строка с текстом «Бутерброд 12» может оказаться впереди строки «Бутерброд 2» хотя предполагалась их сортировка по возрастанию номеров ?
10 Как отменить сортировку в списке?
Список литературы
1 Айвор Хортон VISUAL C++ 2005 Базовый курс, «Диалектика», Москва*Санкт-Петербург*Киев , 2007г.
2 Сергеев А.П., Терен А.Н. Программирование в VISUAL C++ 2005 «Диалектика», Москва*Санкт-Петербург*Киев , 2006г.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.