
- •Л. Б. Бузюков, о. Б. Петрова
- •Учебное пособие
- •Предисловие
- •Глава 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.16. Создание меню
Рассмотрим порядок действий при создании меню приложения.
Добавьте новый ресурс – меню – командой Insert/Resource… На диаграмме ресурсов ResourceView появится новый элемент – меню с идентификатором по умолчанию IDR_MENU1 (рис. 21.5).
Для меню IDR_MENU1 вызовите с помощью контекстного меню команду Properties (Свойства), в открывшемся окне установите язык ресурса меню (окно Language) – русский, при необходимости измените идентификатор меню (окно ID), например, на идентификатор IDR_MAINMENU для главного меню приложения.
Двойным щелчком на элементе IDR_MENU1 на диаграмме ResourceView активизируйте редактор меню.
Рис. 21.5. Редактирование меню
Добавьте в меню элементы верхнего уровня. С помощью контекстного меню соответствующего элемента откройте окно Properties (Свойства) и заполните поле Caption (Подпись), например, Файл, Помощь. Проверьте установку свойства Pop-up: если флажок установлен, то элемент меню будет иметь вложенные элементы, если нет – он будет конечной командой. Элементам меню с установленным свойством Pop-up идентификаторы не присваиваются.
Добавьте в разделы меню верхнего уровня команды (Выход, О программе и т. д.). С помощью контекстного меню элемента и команды Properties (Свойства) каждой команде присвойте идентификатор (поле ID), например, ID_EXIT для команды Выход, ID_ABOUT для команды О программе. Заполните поле Caption (Подпись). Для создания вложенного меню в соответствующем элементе установите свойство Pop-up. Свойство Separator (Сепаратор, или разделитель) разделяет пункты меню горизонтальной линией.
Свяжите меню с классом соответствующего диалогового окна с помощью ClassWizard.
Свяжите каждый пункт меню с кодом программы, для этого используйте ClassWizard и сообщение COMMAND, возникающее при выборе команды меню. В окне ClassWizard установите соответствие между идентификатором меню, например, ID_EXIT, сообщением COMMAND и функцией, обрабатывающий сообщения, например, OnExit().
Свяжите меню с диалоговой панелью, для этого с помощью диаграммы ResourceView следует вызвать окно Свойства диалоговой панели, и в окне Menu выбрать идентификатор меню, например, IDR_MENU1.
21.17. Приложение с двумя диалоговыми панелями
Применим теперь библиотеку MFC для решения задачи о табулировании функции y = sin(x) – будем использовать классы MFC для разработки интерфейса пользователя программы.
Исходные данные задачи табулирования: количество расчетных точек, начальное и конечное значения аргумента x. Ограничение на исходные данные: количество расчетных точек должно быть больше 1.
Требуется вычислить значения функции y(x) в равноудаленных точках на заданном интервале значений x.
В интерфейс пользователя включим следующие элементы:
главную диалоговую панель с меню и окном для вывода результатов табулирования (List Box);
диалоговую панель для ввода исходных данных задачи.
Хранение данных организуем в главной диалоговой панели с помощью новых свойств, включенных в класс диалоговой панели.
Меню будет включать раздел Действия, состоящий из трех команд: Ввод данных, Вычисления, Выход.
Команда Ввод данных открывает модальную диалоговую панель для ввода данных; данные вводятся в окна редактирования Edit Box. Закрытие диалоговой панели производится кнопками OK или Cancel. Закрытие панели кнопкой OK сопровождается передачей данных в главную диалоговую панель. Выбор кнопки Cancel оставляет данные программы без изменений.
Команда Вычисления выполняет вычисления, только если исходные данные были изменены и соответствуют ограничениям задачи. Результаты вычислений выводятся в окно List Box главной диалоговой панели.
Рассмотрим последовательность действий для решения нашей задачи.
Создайте новый проект Dialogs – приложение MFC, основанное на диалоге (Dialog Based).
Настройте свойства главной диалоговой панели IDD_DIALOG1 – замените идентификатор на IDD_DIALOG_MAIN, установите русский язык; удалите кнопку Cancel, статический текст.
Добавьте элементы управления в главную диалоговую панель:
статический текст – IDC_STATIC для заголовка, свойству Caption элемента управления дайте значение «Результаты вычислений»;
окно со списком – IDC_LIST_RESULT для вывода результатов вычислений, свойство Sort (сортировка) отмените; с помощью ClassWizard свяжите с элементом управления переменную m_Result (категория – control).
Добавьте в проект новый ресурс – меню IDR_MENU1, в верхнем уровне которого создайте раздел Действия, в который включите команды Ввод данных, Вычисления, Выход. Свяжите меню с классом главной диалоговой панели и с ресурсом IDD_DIALOG_MAIN.
Добавьте в класс главной диалоговой панели CDialogsDlg в раздел private свойства для хранения данных задачи:
-
int n
– количество точек,
double x_begin
– начальное значение x,
double x_end
– конечное значение x,
double x
– текущее значение x,
double y
– текущее значение функции,
int new_data
– признак ввода новых данных (значение 1 соответствует получению новых исходных данных).
Добавление свойств выполняйте с помощью команды Add Member Variable из контекстного меню диаграммы ClassView.
Добавьте в класс главной диалоговой панели в раздел private функцию, вычисляющую значение заданной математической функции:
#include <math.h>
…………
double CDialogsDlg::f(double t)
{
return sin(t);
}
Добавьте в проект новый ресурс – диалоговую панель для ввода данных IDD_DIALOG_INPUT, свяжите ресурс с новым классом MFC – назовите его CInputDlg.
Разместите на диалоговой панели IDD_DIALOG_INPUT элементы управления: Edit Box – для ввода данных и Static – для поясняющих подписей; создайте с помощью ClassWizard переменные для элементов Edit Box.
Свойства элементов управления и имена связанных с ними переменных приведены в табл. 21.3.
Таблица 21.3
Элемент управления |
Идентификатор ID |
Подпись (Caption) |
Переменная |
Начальное значение переменной |
Static |
IDC_STATIC |
Количество точек |
– |
|
Static |
IDC_STATIC |
Начальное значение x |
– |
|
Static |
IDC_STATIC |
Конечное значение x |
– |
|
Edit Box |
IDC_EDIT1 |
– |
m_num |
10 |
Edit Box |
IDC_EDIT2 |
– |
m_xBegin |
0 |
Edit Box |
IDC_EDIT3 |
– |
m_xEnd |
9 |
Установите начальные значения переменным, для этого с помощью ClassWizard добавьте в класс CInputDlg метод OnInitDialog() и отредактируйте его:
BOOL CInputDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//TODO: Add extra initialization here
m_num=10;
m_xBegin=0;
m_xEnd=9;
UpdateData(FALSE);
return TRUE; //return TRUE unless you set the
//focus to a control
//EXCEPTION: OCX Property Pages should
//return FALSE
}
Отредактируйте функцию OnInitDialog() главной диалоговой панели:
BOOL CDialogsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//Set the icon for this dialog. The
//framework does this automatically
//when the application's main window
//is not a dialog
SetIcon(m_hIcon,TRUE); //Set big icon
SetIcon(m_hIcon,FALSE); //Set small icon
//TODO: Add extra initialization here
new_data=0; //Новые данные отсутствуют
return TRUE; //return TRUE unless you set
//the focus to a control
}
С помощью ClassWizard создайте функции, обрабатывающие выбор команд меню главной диалоговой панели.
Команда Выход:
void CDialogsDlg::OnExit()
{
OnOK();
}
Команда Ввод данных:
void CDialogsDlg::OnInputdata()
{
CInputDlg inputdlg; //Создание объекта –
//панели диалога
new_data=inputdlg.DoModal();
//Функция DoModal() возвращает значение 1,
//если была нажата клавиша OK, или значение 2,
//если была нажата клавиша Cancel
if (new_data==1)
{
if (inputdlg.m_num >1)
{
n=inputdlg.m_num;
x_begin=inputdlg.m_xBegin;
x_end=inputdlg.m_xEnd;
}
else
{
MessageBox("Ошибка вода данных");
new_data=0;
}
}
}
При нажатии кнопки ОК диалоговой панели inputdlg происходит обновление переменных, связанных с элементами управления (табл. 21.3).
Команда Вычисление:
void CDialogsDlg::OnCalculate()
{
//TODO: Add your command handler code here
if (new_data==1)
{
int i;
CString str;
double dx=(x_end-x_begin)/(n-1);
x=x_begin;
m_Result.ResetContent();
for(i=0;i<n;i++)
{
y=f(x);
str.Format("%3d %6.2lf %6.2lf",i+1,x,y);
m_Result.AddString(str);
x +=dx;
}
new_data=0;
}
}