Раздел 4. Применение библиотеки MFC для событийного программирования в Windows
Объектно-ориентированная библиотека классов Microsoft Foundation Classes призвана инкапсулировать вызовы API функций и сократить время на разработку приложений под Windows за счет наличия мастеров и удобных методов классов. Большинство вызовов API функций нашли отражение в вызовах методов соответствующих классов, так API функция MessageBox, принимающая четыре параметра, удобно записывается в виде метода класса окна CWnd и принимает всего один обязательный параметр – строку для вывода. Другим примеров служат классы объектов CGI (например CBrush, который имеет разнообразные методы для создания кисти) и класс контекста устройства -СDC, который, имеет метод SelectObject для выбора созданного объекта CGI.
Для построения приложения на основе MFC, обычно, с помощью AppWizard создается остов определенного типа приложения MFC. Затем, в такое приложение можно добавлять обработчики сообщений Windows при помощи ClassWizard.
Построение приложения MFC с главной диалоговой панелью
Созданный с помощью AppWizard каркас приложения с главной диалоговой панелью состоит из двух классов: класса, класса приложения, который наследуется от CWinApp, и класса диалога, который наследуется от CDialog. Кроме этих классов создается также ресурс диалога, на котором изначально расположены две кнопки: Ok и Cancel.
Точка входа в программу – функция WinMain скрыта в классе CWinApp, и управления при запуске программы передается в функцию InitInstance класса приложения. В этой функции создается объект класса диалога, и диалог выводится на экран методом DoModal класса диалога. Класс диалога содержит конструктор, в который передается идентификатор ресурса диалога, переопределяемую функцию OnInitDialog, которая запускается сразу после создания диалога, обработчики событий перерисовки и переопределяемый метод DoDataExchange, который используется для обмена данными между переменными объекта класса и элементами управления.
После размещения соответствующих элементов управления в ресурсе диалога, с этими элементами при помощи ClassWizard можно связать переменные класса. Обмен данными между переменными класса и элементами управления инициируется посредством вызова функции UpdateData, с аргументом “ложь” для передачи данных из переменных в элементы управления и аргументом “истина”для передачи данных из элементов управления в переменные класса. Функция UpdateData затем обращается к методу DoDataExchange.
ClassWizard также упрощает построение обработчиков событий от элементов управления. Он автоматически генерирует обработчики для большинства типов событий, при этом может быть выбран класс, в который обработчик будет помещаться.
Классы для работы с файлами
Для создания, записи и чтения из файла можно использовать класс CFile. Этот класс инкапсулирует вызовы API функций для работы с файлами и используется в основном для бинарного ввода и вывода. Для работы с текстом используют производный класс от CFile – CstdioFile, который имеет два добавочных метода ReadString и WriteString. Метод ReadString читает строку до символа конца строки и возврата каретки, а метод WriteString автоматически вставляет символы конца строки и возврата каретки, если в строке встречается символ новой строки ‘\n’.
Работа со строками в MFC
В MFC имеется очень удачный класс для работы со строками – Cstring. Этот класс имеет метод Format, позволяющий переводить переменные различных типов в строки, операцию склеивания строк “+”. Класс динамически увеличивает свой размер при добавлении новых символов. Переменные класса CString могут использоваться везде, где подразумевается указатель на константную строку. Для перевода объектов класса CString в числовые переменные можно использовать стандартные функции atoi, atol, atof.
Задание 4. Разработать приложение MFC с главным окном диалога, расположив на нем элементы управления, указанные в соответствующем варианте. Предусмотреть пункт меню, сохраняющий состояние элементов управления в файле и считывание из этого файла с инициализацией элементов управления.
Цель: получение навыков создания приложения Windows на основе библиотеки классов MFC, практика проектирования интерфейса на основе окон диалога.
Таблица 4
Варианты задания 4
№ варианта | Задание |
1 | Выбор из раскрывающегося списка отображается в надписи, изменения ползунка отображается в поле редактирования. |
2 | Изменения счетчика отображаются в индикаторе прогресса, выбор из списка отображается в надписи. |
3 | Выбор переключателя отображается в списке, изменения счетчика отображается в поле редактирования. |
4 | Число отмеченных флажков отображается в надписи, изменения счетчика отображает индикатор прогресса. |
5 | В зависимости от выбора переключателя отмечается разное число флажков, это число отображается в надписи. |
6 | В зависимости от выбора переключателя, вводимый текст в окне редактирования отображается либо в первой, либо во второй надписи. |
7 | Нажатие на кнопку меняет текст в поле редактирования, изменения в горизонтальной полосе прокрутки отображаются индикатором прогресса. |
8 | В зависимости от выбора переключателя в рисунке отображается та или иная картинка, изменения счетчика отображаются индикатором прогресса. |
9 | В зависимости от выбора в списке отмечается пункт переключателя, надпись отображает текст, введенный в поле редактирования. |
10 | Изменения в вертикальной полосе прокрутки отображаются индикатором прогресса, число отмеченных флажков, отображаются в надписи. |
11 | Выбор переключателя разрешает или запрещает редактирование в окне редактирования, нажатие на кнопку меняет текст в поле редактирования. |
12 | Изменения счетчика отображаются в поле редактирования, выбор переключателя отображается в списке. |
13 | Текст, вводимый в окно редактирования, отображается в поле редактирования, изменения счетчика отображаются индикатором прогресса. |
14 | Выбор в раскрывающемся списке отображается в простом списке, изменения счетчика отображаются индикатором прогресса. |
15 | Выбор переключателя разрешает или запрещает изменения в окне редактирования, изменения полосы прокрутки отображаются в надписи. |
16 | Выбор переключателя дублируется соответствующим флажком, изменения ползунка отображаются в вертикальной полосе прокрутки. |
17 | С помощью счетчика меняется число символов доступных для ввода в окне редактирования, число отображается в поле редактирования. |
18 | Изменения вертикальной полосы прокрутки отображаются в поле редактирования, позиция переключателя дублируется флажками. |
19 | Щелчок мышью на рисунке меняет его картинку, число нажатых флажков отображается в поле редактирования. |
20 | Изменения счетчика отображается числом отмеченных флажков, изменения переключателя отображаются раскрывающимся списком. |
21 | Выбор в раскрывающемся списке отображается в переключателе, счетчик меняет число символов, доступных для ввода в окно редактирования. |
22 | Введенное в поле редактирования число, отображается в вертикальной полосе прокрутки, выбор в переключателе дублируется флажком. |
23 | Выбор в списке отображается в поле редактирования, нажатие на кнопку включает и отключает флажок. |
24 | Число нажатий на кнопку отображается индикатором прогресса, число нажатых флажков отображается переключателем. |
25 | Ввод символов в поле редактирования дублируется в окне редактирования, выбор переключателя отображается в списке. |
Указания. Для использования событий вертикальной или горизонтальной полос прокрутки на вкладке «Message Map» ClassWizard в списке объектов нужно выбрать класс диалога и использовать его события WM_VSCROLL или WM_HSCROLL. Для использования окна редактирования необходимо вставить вызов функции AfxInitEdit в функцию InitInstance разрабатываемого приложения. При использовании элемента рисунок нужно изменить его идентификатор с IDC_STATIC на любой другой, наример IDC_STATIC1, в этом случае можно будет использовать ClassWizard для автоматизации работы с этим элементом. Для управлением положением переключателя из программы можно использовать функцию CheckRadioButton. Вызвать диалог открытия/сохранения файла можно с помощью класса СFileDialog. В таблице 5 приведены названия элементов управления на русском языке и их англоязычные названия.
Таблица 5
Соответствие между названиями элементов управления на русском и английском языке
Названия на русском языке | Названия на английском языке |
Надпись | Label, Static Text |
Рисунок | Picture |
Флажок | Check Box |
Переключатель, Кнопки выбора | Radio Button |
Поле редактирования | Edit Box |
Окно редактирования | Rich Edit |
Кнопка | Button |
Ползунок | Slider, TrackBar |
Индикатор прогресса | Progress Bar |
Полоса прокрутки | Scroll Bar |
Счетчик | Spin, Up-Down |
Раскрывающийся список, Комбинированный список | Drop-Down List, Combo Box List |
Список | List |