
- •Л. Б. Бузюков, о. Б. Петрова
- •Учебное пособие
- •Предисловие
- •Глава 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.22. Графические объекты Windows в mfc
Графические объекты представляют собой инструменты для рисования в контексте дисплея: перья, кисти, шрифты, растровые изображения, области, палитры. В MFC включено несколько классов, предназначенных для создания графических объектов Windows. Так как графические объекты в Windows доступны через дескрипторы, каждому дескриптору ставится в соответствие класс MFC.
Инструменты |
Тип дескриптора |
Класс MFC |
Перья |
HPEN |
CPen |
Кисти |
HBRUSH |
CBrush |
Шрифты |
HFONT |
CFont |
Растровые изображения |
HBITMAP |
CBitmap |
Области |
HRGN |
CRgn |
Палитры |
HPALETTE |
CPalette |
Все классы графических объектов имеют один базовый класс – CGdiObject, который в свою очередь имеет базовый класс CObject.
Рассмотрим порядок работы с графическими объектами.
Объявим объект в пределах блока программного кода и выполним инициализацию методом Create() для конкретного объекта, например, для палитры следует использовать метод CreatePalette().
Выбираем новый объект в текущем контексте: CDC::SelectObject(). Метод возвращает указатель на замещаемый объект (палитру, кисть и т. д.).
После выполнения графической операции возвращаем замещенный графический объект обратно в контекст.
21.23. Графические операции в mfc
Графические операции в MFC представляют собой методы класса CDC и его производных классов. Рассмотрим примеры построения графических примитивов.
Вывод строки:
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
dc.TextOut(200,200,"TextOut Samples");
//Координаты x,y начала вывода текста и сам текст
}
Вывод точки:
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
dc.SetPixel(500,200,RGB(255,0,0));
//Координаты x, y точки и ее цвет, соответствующий
//палитре RGB
}
Рисование дуги окружности:
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
dc.Arc(200,200,100,100,400,400,10,10);
//dc.Arc(x1,y1,x2,y2,x3,y3,x4,y4), где
//x1,y1,x2,y2 – координа ты прямоугольника,
//в который вписывается эллипс,
//x3,y3 – начальная точка,
//x4,y4 – конечная точка прямой линии,
//отсекающей от эллипса дугу,
//дуга чертится против часовой стрелки
//от точки x3,y3 до точки x4,y4.
}
Замкнутая дуга:
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
dc.Chord(250,250,100,100,400,400,10,10);
//Рисует сегмент эллипса, параметры
//аналогичны параметрам функции Arc()
}
Эллипс:
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
dc.Ellipse(450,450,50,150); //Параметры функции //Ellipse() – координаты точек x1, y1 и
//x2, y2, задающих прямоугольник,
//в который вписывается эллипс
}
Прямая линия:
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
dc.MoveTo(200,200); //Установка курсора в
//заданную точку окна с
//координатами x1,y1
dc.LineTo(100,100); //Рисование линии
//от текущей позиции курсора
//до заданной точки с координатами x2,y2
}
Ломаная линия:
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
int n=5; //Количество точек ломаной линии
CPoint pt[5]; //Массив координат точек ломаной
pt[0].x=30;
pt[0].y=70;
pt[1].x=480;
pt[1].y=90;
pt[2].x=120;
pt[2].y=40;
pt[3].x=190;
pt[3].y=60;
pt[4].x=250;
pt[4].y=200;
dc.Polyline(pt,n); //Рисование ломаной линии
//Если координаты первой и последней
//точки совпадают, ломаная получается
//замкнутой, иначе – разомкнутой
}
Многоугольник:
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
int n=5; //Количество вершин многоугольника
CPoint pt[5]; //Массив координат вершин
//многоугольника
pt[0].x=30;
pt[0].y=70;
pt[1].x=480;
pt[1].y=90;
pt[2].x=120;
pt[2].y=40;
pt[3].x=190;
pt[3].y=60;
pt[4].x=250;
pt[4].y=200;
dc.Polygon(pt,n); //Рисование многоугольника
// – все точки массива соединяются прямыми
//линиями, включая последнюю и первую точки
}
Рассмотрим программу, которая осуществляет вывод квадрата в середину диалоговой панели (рис. 21.7). В зависимости от выбранных радиокнопок изменяются размеры квадрата. Перерисовка изображения происходит сразу после выбора новой радиокнопки.
Рис. 21.7. Вывод квадрата в диалоговое окно
Для создания программы необходимо выполнить следующие шаги.
1. Создайте в среде Visual C++ приложение, использующее библиотеку MFC – MFC AppWizard(exe); вариант приложения – Dialog Based, название – Graphmfc1.
2. Отредактируйте диалоговую панель:
в свойствах диалоговой панели установите язык диалоговой панели – русский;
удалите кнопку Cancel;
измените текст и положение статической строки: в свойство Caption элемента введите текст «Рисование квадрата»;
добавитьте элемент управления Group и отредактируйте его подпись: в свойство Caption элемента введите текст «Коэффициент»;
внутри элемента Group разместите три радиокнопки – элементы Radio Button. Настройте свойства 1-й радиокнопки: установите флажок Group;
внутри элемента Group разместите три статических строки и введите в них подписи к радиокнопкам, обозначающие коэффициент, определяющий размеры квадрта, – «х1», «х2», «х3».
3. Добавьте в программу переменную m_Size, связанную с радиокнопками (категория value, тип int).
4. Инициализируйте радиокнопки – выберите при открытии диалоговой панели первую радиокнопку; для этого в функции OnInitDialog() диалоговой панели после строки //TODO Add extra initialization here добавьте код:
//TODO: Add extra initialization here
m_Size=0;
UpdateData(FALSE);
5. Отредактируйте функцию OnPaint():
void CGraphmfc1Dlg::OnPaint()
{
if (IsIconic())
{
……
}
else
{
CPaintDC dc(this); //Объявление контекста
//экрана
CRect rect; //Структура для хранения координат //квадрата
CRect clientrect; //Структура для хранения
//координат клиентской области окна
GetClientRect(clientrect); //Получение
//координат клиентской области окна
//Координаты центра клиентской области окна
int mx=clientrect.left+(clientrect.right–
clientrect.left)/2;
int my=clientrect.top+(clientrect.bottom–
clientrect.top)/2;
//Длина стороны квадрата, зависит от выбора
//радиокнопки
int width=50*(m_Size+1);
//Координаты прямоугольника
rect.bottom=my+width;
rect.left=mx–width;
rect.top=my–width;
rect.right=mx+width;
dc.Rectangle(rect); //Рисование прямоугольника
//в контексте
}
}
Вызов метода OnPaint() базового класса CDialog::OnPaint() не требуется; также не требуется разрушать объект dc, поскольку при завершении блока будет вызван деструктор, который и разрушит объект.
6. Свяжите с каждой радиокнопкой обработчик нажатия кнопки; обработчик выполняет два действия: обновляет значение переменной, связанной с радиокнопками, и вызывает перерисовку окна – метод Invalidate(), который вызывает в свою очередь метод OnPaint().
void CGraphmfc1Dlg::OnRadio1()
{
UpdateData(TRUE);
Invalidate();
}
Программа готова!