- •Л. Б. Бузюков, о. Б. Петрова
- •Учебное пособие
- •Предисловие
- •Глава 1. Введение в язык с
- •1.1. История создания и особенности языка с
- •1.3. Элементы языка с
- •1.3.1. Основные символы
- •1.3.2. Ключевые слова
- •1.3.3. Идентификаторы
- •1.3.4. Константы
- •1.3.5. Лексемы
- •1.3.6. Комментарии
- •Глава 2. Типы данных языка c
- •2.1. Числовые типы данных
- •2.2. Объявление переменных
- •2.3. Данные целого типа
- •2.4. Данные вещественного типа
- •Глава 3. Выражения
- •3.1. Операции
- •3.1.1. Арифметические операции
- •3.1.2. Операция присваивания
- •Глава 4. Составление простейших программ
- •4.1. Препроцессор и его функции
- •4.2. Основные директивы препроцессора
- •4.2.1. Директива include
- •4.2.2. Директива define
- •4.2.3. Директива undef
- •4.3. Структура и правила составления программ
- •4.3.1. Структура функции
- •4.3.2. Функция main()
- •4.3.3. Структура простой программы
- •4.3.4. Правила записи объявлений, операторов и комментариев
- •4.3.5. Пример простейшей программы
- •Глава 5. Средства ввода/вывода
- •5.1. Общие замечания
- •5.2. Функция форматированного вывода printf()
- •5.2.1. Основные форматы
- •5.2.2. Модификации форматов
- •5.3. Функция форматированного ввода scanf()
- •Глава 6. Управляющие операторы
- •6.1. Условные операторы
- •6.1.1. Логические выражения
- •6.1.2. Формы оператора if
- •6.1.3. Оператор выбора switch
- •6.2. Операторы цикла
- •6.2.1. Оператор while
- •6.2.2. Оператор for
- •6.2.3. Оператор do-while
- •6.3. Операторы перехода
- •6.3.1. Оператор break
- •6.3.2. Оператор continue
- •6.3.3. Оператор return
- •6.3.4. Применение оператора goto и меток
- •Глава 7. Функции
- •7.1. Основные понятия
- •7.2. Определение функции
- •7.3. Прототип функции
- •7.4. Вызов функции
- •Глава 8. Классы памяти
- •8.1. Логическаяструктура памяти программы
- •8.2. Особенности классов памяти
- •8.3. Объявления переменных
- •8.4. Объявления функций
- •8.5. Время жизни и область видимости программных объектов
- •8.6. Инициализация глобальных и локальных переменных
- •Глава 9. Указатели
- •9.1. Операция получения адреса
- •9.2. Операции над указателями
- •Глава 10. Массивы
- •10.1. Общие сведения о массивах
- •10.2. Одномерные массивы
- •10.3. Двумерные массивы
- •10.4. Массивы и указатели
- •10.5. Массивы и функции
- •Глава 11. Строки
- •11.1. Представление символьной строки при помощи одномерного массива
- •11.2. Указатель на символьную строку
- •11.3. Ввод/вывод символьных строк
- •11.4. Массивы символьных строк
- •11.5. Функции работы состроками
- •Глава 12. Структуры
- •12.1. Определение структуры
- •12.2. Структуры и функции
- •12.3. Указатели на структуру
- •12.4. Массивы структур
- •12.5. Вложенные структуры
- •12.6. Использование синонима типа
- •12.7. Объединения
- •Глава 13. Файлы
- •13.1. Работа с файлами
- •13.2. Функции ввода/вывода
- •Глава 14. Динамическая память
- •14.1. Распределение памяти
- •14.2. Функции управление памятью
- •Глава 15. Проект
- •15.1. Основы создания проекта
- •15.2. Пример создания проекта
- •Глава 17. Основы объектно-ориентированного программирования
- •17.1. Объектно-ориентированный подход
- •17.3. Конструкторы и деструкторы
- •17.4. Инкапсуляция
- •17.5. Полиморфизм
- •17.6. Наследование
- •17.7. Виды взаимодействия классов
- •17.8. Способы графического представления объектно-ориентированной задачи
- •18.2. Библиотека Win32 api
- •18.3. Библиотека owl
- •18.4. Библиотека vcl
- •18.5. Библиотека clx
- •18.6. Библиотека mfc
- •18.7. Библиотека OpenGl
- •19.3. Создание проекта
- •19.4. Редактирование проекта
- •19.5. Компиляция и выполнение программы
- •19.6. Файловая структура проекта
- •19.7. Создание консольного приложения
- •Глава 20. Разработка приложений для операционных систем windows
- •20.1. Взаимодействие программы и Windows
- •20.2. Компоненты библиотеки Win32 api
- •20.3.Функция WinMain()
- •20.4. Оконная процедура
- •20.5. Структура программы для ос Windows
- •20.6. Ресурсы Windows
- •20.7. Взаимодействие прикладной программы и устройств в Windows
- •Глава 21. Создание приложений для ос windows на основе библиотеки mfc
- •21.1. Обзор классов библиотеки mfc
- •21.2. Класс cString
- •21.3. Класс cFile
- •21.4. Класс cPoint
- •21.5. Класс cRect
- •21.7. Приложение, основанное на диалоге
- •21.8. Использование в приложении элементов управления
- •21.9. Мастер классов mfc ClassWizard
- •21.10. Установка начального значения элементам управления
- •21.11. Элементы управления Picture
- •21.12. Элемент управления Group Box
- •21.13. Элемент управления Radio Button
- •21.14. Элемент управления Check Box
- •21.15. Элемент управления List Box
- •21.16. Создание меню
- •21.17. Приложение с двумя диалоговыми панелями
- •21.18. Приложение sdi
- •21.19. Создание панели инструментов
- •21.20. Приложение mdi
- •21.21. Контекстыустройств в mfc
- •21.22. Графические объекты Windows в mfc
- •21.23. Графические операции в mfc
- •П.1. Основы методологии конструирования программ
- •П.1.1. Основные понятия. Программа и алгоритм
- •П.1.2. Этапы разработки программ
- •П.2. Алгоритмы
- •П.2.1. Алгоритм и его свойства
- •П.2.2. Способы описания алгоритмов
- •П.2.3. Средства графического изображения алгоритмов Схемы алгоритмов
- •Псевдокоды
- •Структурограммы
- •П.3. Основные приемы программирования
- •П.3.1. Разновидности структур программирования
- •П.3.2. Программирование линейных и разветвляющихся процессов
- •П.3.3. Программирование циклических процессов
- •Арифметический цикл (цикл с параметром)
- •Итерационный цикл
- •Вложенный цикл
- •Литература
21.7. Приложение, основанное на диалоге
Приложение, основанное на диалоге – это Dialog Based Application, этапы создания которого следующие.
1. Вызов команды File/New…
2. Настройка параметров проекта в окне AppWizard/Projects:
тип приложения – MFC AppWizard (exe),
имя проекта (Name),
размещение проекта (Location),
флажок создания нового рабочего пространства в состоянии «установлен»,
нажать OK.
3. Первый шаг мастера: выбор варианта приложения – Dialog based, использовать для ресурсов по умолчанию английский язык.
4. Второй шаг мастера: отменить добавление окна About Box (снять флажок About Box), этим действием мы упростим код программы, остальные настройки можно оставить без изменения, кроме того, можно изменить текст заголовка окна приложения (title).
5. Третий шаг мастера: можно все настройки оставить без изменения; на этом шаге среда получает указание включать автоматически комментарии в текст программы, а также задается способ подключения библиотеки MFC к программе – динамическое подключение (As a shared DLL); для опытных программистов можно отменить добавление в код программы комментариев; при необходимости исполнения разрабатываемого приложения на компьютерах, где не установлены соответствующие файлы библиотеки MFC, сделать статическое подключение библиотеки (As a statically linked library)
На этом работа мастера MFC AppWizard завершается, каркас приложения создан. Рассмотрим, какие классы и файлы мы получили.
В каркас такого приложения вошли два класса: класс приложения, производный от класса библиотеки MFC CWinApp, и класс диалоговой панели, производный от класса CDialog. Среда разработки автоматически дает имена этим производным классам в соответствии со следующим правилом: в начало имени производного класса ставится буква C, затем добавляется имя проекта, а в конце – имя базового класса. Например, если проект получил имя Lab1, то его собственный класс приложения будет иметь имя CLab1App, а класс диалогового окна – CLab1Dlg.
Рассмотрим файловый состав проекта:
Lab1.h и Lab1.cpp – модуль, содержащий описание класса приложения CLab1App;
Lab1Dlg.h и Lab1Dlg.cpp – модуль, содержащий описание класса диалоговой панели приложения CLab1Dlg;
stdafx.h и stdafx.cpp – системный модуль, генерируемый средой для связи с библиотеками C++, прежде всего с библиотекой MFC;
resource.h – заголовочный файл, определяющий идентификаторы элементов управления;
Lab1.rc – файл ресурсов, содержащий описание в текстовом формате диалоговой панели, меню и других ресурсов Windows. Стандартная диалоговая панель (рис. 21.2), создаваемая средой по умолчанию, включает в себя строку заголовка с кнопкой закрытия окна, статический текст «TODO: place dialog controls here» и две кнопки – OK и Cancel; обе кнопки выполняют по умолчанию одно и то же действие – завершение программы.
Рассмотрим пример простейшего диалога: на диалоговую панель помещена кнопка. Когда пользователь нажимает кнопку, появляется стандартное информационное окно MessageBox с сообщением «Команда выполнена!».
Для создания такой программы выполним следующие шаги:
перейдем на вкладку ResourceView окна Workspace,
раскроем ветвь диаграммы ресурсов.
Рис. 21.2. Стандартная диалоговая панель
Выделим на диаграмме ресурсов объект – диалоговую панель IDD_LAB1_DIALOG – и в его контекстном меню выберем команду Properties. В открывшемся окне изменим язык ресурса на русский (окно Language). Теперь в диалоговой панели для надписей можно будет использовать кириллицу. Закроем окно Properties.
Дважды щелкнем на объекте IDD_LAB1_DIALOG в окне Workspace, при этом в графическом редакторе откроется диалоговая панель. Удалим с диалоговой панели кнопки OK и Cancel, а также статическую строку «TODO: place dialog controls here».
На панели элементов управления Controls выберите кнопку – объект Button –и укажите щелчком левой кнопки мыши место размещения объекта в диалоговом окне. В окне диалога при этом появится небольшая кнопка с надписью Button1.
Отредактируем свойства кнопки. Для этого выделим кнопку Button1 и в ее контекстном меню выберем команду Properties. Затем в окне ID изменим идентификатор кнопки с IDC_BUTTON1 на IDC_BUTTON_MSG. Изменять идентификатор вовсе не обязательно, но для облегчения чтения программы следует элементам программы давать «говорящие» имена, т. е. идентификаторы, которые не только называют элементы, но и содержат пояснения по данному элементу. Изменим также надпись на кнопке – в окно Caption введем произвольный текст, например, слово «Сообщение». Закроем окно свойств кнопки.
Создадим функцию, вызываемую нажатием кнопки. Для этого из контекстного меню кнопки выберем команду ClassWizard, которая откроет окно ClassWizard, при этом будет активна вкладка Message Maps. Message Maps – карта отображения сообщений – используется при работе с библиотекой MFC для связывания сообщения, элемента управления, реагирующего на это сообщение, и метода, выполняемого при появлении этого сообщения. Более подробно карту сообщений рассмотрим позже.
В окне Message Maps выполним следующие действия: в списке Object IDs активизируем объект IDC_BUTTON_MSG, в окне Message при этом отобразятся два сообщения, на которые реагирует кнопка – BN_CLICKED и BN_DOUBLECLICKED, что означает одиночный и двойной щелчок мышью на кнопке соответственно. В списке Messages выберем сообщение BN_CLICKED, нажмем кнопку Add Function, напечатаем, если нужно, новое имя функции (по умолчанию будет сконструировано имя OnButtonMsg) и нажмем кнопку OK. Функция создана.
Редактируем функцию. Созданная только что функция не выполняет никаких действий, и наша задача - научить ее что-нибудь делать. Для редактирования функции в окне Message Maps должна быть выделена функция OnButtonMsg(), затем нажимаем кнопку Edit Code, после чего активизируется окно с текстом этой функции. Добавим в тело функции текст: MessageBox("Команда выполнена!");
Приложение готово. Откомпилируем его. Согласимся, если будет предложено откомпилировать недостающие файлы. Если при компиляции не будут обнаружены ошибки, выполним приложение.
Рассмотрим более сложную задачу: пользователь вводит число, программа возводит его в квадрат и выводит результат на экран.
Для выполнения этой задачи будем использовать предыдущее приложение – просто добавим в него новую функцию; с таким же успехом можно было бы создать новое приложение.
Для решения задачи выполним следующую последовательность действий.
Перейдем на вкладку ResourceView и дважды щелкнем на элементе IDD_LAB1_DIALOG, при этом в графическом редакторе откроется диалоговая панель.
Добавим в диалоговую панель новую кнопку, для этого элемент управления кнопку Button выберем в панели Controls (элементы управления) и поместим его в нужное место диалоговой панели. Если панель Controls по каким-либо причинам не видна на экране, включите ее командой Tools/Customize/Toolbars.
Зададим свойства кнопки – в ее контекстном меню выберем команду Properties, в окне свойств укажем идентификатор кнопки (ID) – IDC_BUTTON_CALC, в окне Caption введем текст – Вычисления. Закроем окно свойств.
Добавим в диалоговую панель окно редактирования Edit, которое будет использоваться для ввода и вывода информации. В контекстном меню окна Edit выберем команду Properties и зададим идентификатор окну – IDC_EDIT_RESULT. Закроем окно.
Свяжем с окном редактирования IDC_EDIT_RESULT переменную, которая будет использоваться для хранения числового значения, введенного в окно редактирования. Выделим окно редактирования, и в его контекстном меню выберем команду ClassWizard, вкладку Member Variable. В открывшемся окне проверим информацию, помещенную в окна: Project – Lab1, Class – CLab1Dlg. В окне Control IDs выделим объект IDC_EDIT_RESULT, нажмем кнопку Add Variable. В открывшемся окне Add Variable укажем имя переменной, оно обязательно должно начинаться с символов m_, – m_Result, укажем категорию переменной (value – переменная или control – элемент управления) – value, тип переменной – CString. Тип (класс) CString представляет собой последовательность символов – строку, над которой определены некоторые действия, например, сложение. Нажмем кнопку OK, затем второй раз OK, после чего переменная m_Result будет добавлена в программу.
Создадим функцию – обработчик нажатия кнопки, которая будет выполняться при нажатии кнопки. Для этого в контекстном меню кнопки выберем команду ClassWizard. Эта команда позволит нам войти в приложение ClassWizard, генерирующее служебную часть кода класса. В окне ClassWizard на вкладке Message Maps проверим информацию, помещенную в окна: Project – Lab1, Class – CLab1Dlg. В окне Object IDs выделим объект IDC_BUTTON_CALC. В окне Messages выберем сообщение BN_CLICKED. Затем в правой части окна Message Maps нажмем кнопку Add function, в ответ на экране появится окно, предлагающее имя нашей функции – по умолчанию она будет называться OnButtonCalc(). Можно дать функции другое имя или согласиться с предложенным. После нажатия кнопки OK среда вставляет в программу заготовку для этой функции.
Для редактирования кода функции нажмем кнопку Edit Code окна Message Maps, после чего мы окажемся внутри редактируемой функции.
В тело функции вставим следующие строчки:
UpdateData(TRUE); //Присваивание значений,
//введенных в элементы управления,
//переменным, связанным с этими
//элементами управления
double Number; //Объявление вещественной переменной
Number=atof(m_Result); //Преобразование переменной //типа CString, связанной с окном
//редактирования, в число
Number*=Number; //Вычисления
m_Result.Format("%lf",Number); //Преобразование
//числового значения в значение
//типа CString и запись
//результата в переменную,
//связанную с окном редактирования
UpdateData(FALSE); //Вывод значений переменных,
//связанных с элементами
//управления, на экран и
//обновление элементов управления
В этом методе использовалась функция UpdateData(), которая устанавливает соответствие между элементами управления на диалоговой панели и связанными с ними переменными. Функция UpdateData() имеет один параметр логического типа. Значение TRUE этого параметра означает, что переменным элементов управления присваиваются значения, введенные в эти элементы; FALSE означает, что элементам управления присваиваются значения из соответствующих переменных. Если параметр не указан, функция по умолчанию использует значение TRUE.
Откомпилируем проект, выполним программу и убедимся, что она работает правильно.
