Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СОВРЕМЕННЫЕ МЕТОДЫ ПРОГРАММИРОВАНИЯ.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
797.27 Кб
Скачать

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();

}

Программа готова!