Лабораторная работа №5. Работа с элементом управления «Комбинированный список» (ComboBox)
Цель лабораторной работы: Научиться использовать элемент управления ComboBox,изучить основные методы класса CComboBox, предназначенным для управления данным элементом.
Класс CComboBox
Элемент управления ComboBox представляет собой список ListBox в комбинации с редактором Еdit или надписью Static. Данный элемент называют комбинированным окном. Окно при этом может иметь два состояния: как распахнутое (которое отображается постоянно), так и свернутое (отображается при щелчке на элементе «стрелка вниз»). Элементы списка в окне можно выбирать и тогда они отображаются или в окне редактирования или в окне статического элемента.
Три модификации компонента определяются его свойством «Type» в закладке окна свойств Style. В таблице 1. приведено сравнение этих трех стилей.
Таблица 1. – Сравнение стилей
Стиль | Когда отображается ListBox? | Что отображается, Еdit или Static? |
Simple | Всегда | Edit |
Drop-down | После нажатия кнопки со стрелкой | Edit |
Drop-down list | После нажатия кнопки со стрелкой | Static |
Для управления элементом ComboBox в библиотеки MFC существует класс CСomboBox. Чтобы добавить новую строку в выпадающий список нужно использовать функцию:
int AddString( LPCTSTR lpszItem );
здесь параметр lpszItem – указатель на нуль-терминированную стороку, добавляемую в список. Для очистки списка служит функция:
void ResetContent( );
В списке элемента ComboBox пользователь может выбирать элементы и для того, чтобы определить какой элемент был выбран, нужно воспользоваться функцией:
int GetCurSel( ) const;
Эта функция не принимает параметров и возвращает индекс выбранного элемента, причем индекс начинается с нуля.
Если необходимо из списка по заданному индексу элемента определить его содержимое, то можно воспользоваться следующей функцией:
void GetLBText( int nIndex, CString& rString ) const;
здесь nIndex – индекс элемента, rString – сторока, куда помещается текст.
Пример написания программы
Задание. В поле ввода вводятся последовательно строки и кнопкой «Add» добавляются в поле ComboBox (рисунок 1). Затем щелчком левой клавишей мыши выбирается соответствующая строка (выбранная строка отобразится в верхнем окошке ComboBox). Щелчок на кнопке «RUN» произведет подсчет пробелов в выделенной строке и отобразит результат в поле вывода.
Для решения задачи необходимо проделать следующие действия:
1)Создать при помощи MFCAppWizard(exe) новый проект типа Dialog based (предварительно выбрав путь и имя).
2) Используя панель Controls нанести на Dialog - 2 элементa типа Edit Box (поле ввода строки и поле вывода), используя Static Text нанести на окно нужные пояснения, 3 – Buttons; и 1 – ComboBox для вывода добавляемых строк. Установить нужные свойства и надписи. Для ComboBox – в закладке Styles: Type->Simple и активизировать Vertical scroll.
3) При помощи ClassWizard через закладку Member Variables: связать поле Edit1 с переменной m_a (тип CString): ClassWizard/Member Variables, сделать щелчок на IDC_EDIT1, щелчок на Add Variable в закладке name: m_a type: CString и нажать «OK»; для поля вывода IDC_EDIT2: name: m_a type: Cstring и в свойствах: Multiline (можно добавить вертикальный скроллинг). Элемент ComboBox связать c m_c, установив Category: Control для данного объекта тип CComboBox, т.е. для данного объекта можно вызывать методы по всей цепи иерархии данного класса MFC.
4) Связать через ClassWizard/Message maps кнопки с событием «один щелчок» и активировать обработчики. Так, для стирания окон вывода в обработчик щелчка на кнопке «Clear» можно вызвать следующий метод:
m_c.ResetContent(); и m_b=””.
Обработчик кнопки «Add» добавляет в поле вывода ComboBox строку, набранную в поле ввода одновременно очищая последнюю.
Его текст:
UpdateData(TRUE);
m_c.AddString(m_a);
m_a="";
UpdateData(FALSE);
}
Обработчик кнопки «RUN» выводит в поле вывода номер выбранной строки и количество пробелов в ней. Текст программы следующий:
CString s1;
int i,j=0;
char str[25];
CComboBox *p=(CComboBox *)GetDlgItem(IDC_COMBO1);
i=p->GetCurSel();
if (i==LB_ERR)
AfxMessageBox("String No SELECT!!!");
else
{
p->GetLBText(i, str);
AfxMessageBox(str);
}
Т.е. объявляем указатель p на элемент ComboBox, через него вызываем метод GetCurSel() для определения номера выбранной строки. Далее контролируем: если выбор строки не сделан, то получаем AfxMessageBox с сообщением об этом. Если же строка выделена, методом GetLBText копируем выделенную строку списка в str и отбражаем ее в AfxMessageBox.
Данный участок программы решает поставленную задачу, т.е. подсчитывает число пробелов в выделенной строке:
int k=strlen(str);
for(int i1=0;i1<k;i1++)
if (str[i1]==' ') j++;
s1.Format("Count of spaceBar's in string №%d is=%d%c%c",i,j,13,10);
m_b=m_b+s1;
UpdateData(FALSE);
}
Вначале текста программы нужно подключить заголовочный файл string.h
4) Находясь в режиме конструктора диалога командой Layout/Tab Order, установить необходимую очередность перехода между элементами управления, поле ввода должно иметь №1.
Индивидуальные задания
1. Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран группу с пятью символами.
2. Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран самую короткую группу.
3. Дана строка, состоящая из групп нулей и единиц. Подсчитать количество символов в самой длинной группе.
4. Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран группы с четным количеством символов.
5. Дана строка, состоящая из групп нулей и единиц. Подсчитать количество единиц в группах с нечетным количеством символов.
6. Дана строка, состоящая из букв, цифр, запятых, точек, знаков ”+” и ”-”. Вывести подстроку, которая соответствует записи целого числа ( т.е. начинается со знаков ”+” и ”-” и внутри подстроки нет букв, запятых и точек ).
7. Дана строка, состоящая из букв, цифр, запятых, точек, знаков ”+” и ”-”. Вывести подстроку, которая соответствует записи вещественного числа с фиксированной точкой.
8. Дана строка, состоящая из букв, цифр, запятых, точек, знаков ”+” и ”-”. Вывести подстроку, которая соответствует записи вещественного числа с плавающей точкой.
9. Дана строка символов, состоящая из произвольных десятичных цифр, разделенных пробелами. Вывести на экран числа строки в порядке возрастания их значений.
10. Дана строка символов, состоящая из произвольных десятичных цифр, разделенных пробелами. Вывести на экран четные числа этой строки.
Контрольные вопросы:
1. Чем отличается элемент управления ComboBox от ListBox?
2. Назовите основные методы класса CComboBox.
3. Назовите 3 модификации элемента ComboBox.