пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Классы изобразительных средств. Примеры рисования простейших фигур.

Классы изобразительных средств

В контексте устройства есть ряд классов изобразительных средств, которые являются наследниками CGdiObject. В MFC их шесть.

CObject -        |-CBitmap

                 |                    |-CBrush

                 CGdiObject---|-CFont

                                      |-CPalette

                                      |-CPen

                                      |-CRgn

Теперь кратко о каждом классе. CBitmap - это класс, который умеет работать с растровыми изображениями. CBrush - это кисть для рисования. CFont - класс шрифта текста. CPalette - класс умеющий работать с цветовыми палитрами. CPen - класс пера и CRgn - класс региона, то есть области вывода.

Рисование простейших фигур

Рассмотрим примеры:

Вывести строку:

void CMainWnd::OnPaint()

зн

   CPaintDC dc(this);

   dc.TextOut( X1, Y1,"TextOut Samples");

зн

 

Вывести точку, чем выше разрешение экрана, тем меньше точка.

void CMainWnd::OnPaint()

зн

   CPaintDC dc(this);

   dc.SetPixel(500,200,RGB(255,0,0));

зн

Дуга окружности:

void CMainWnd::OnPaint()

зн

   CPaintDC dc(this);

   dc.Arc(200,200,100,100,400,400,10,10);

зн

Замкнутая дуга:

void CMainWnd::OnPaint()

зн

   CPaintDC dc(this);

   dc.Chord(250,250,100,100,400,400,10,10);

зн

Эллипс:

void CMainWnd::OnPaint()

зн

   CPaintDC dc(this);

   dc.Ellipse(450,450,50,150);

зн

Линия:

void CMainWnd::OnPaint()

зн

   CPaintDC dc(this);

   dc.MoveTo(200,200);

   dc.LineTo(100,100);

зн

Как выполняется рисование и вычерчивание в программе, использующей MFC

Одно из основных сообщений, которое должна уметь обрабатывать любая Windows-программа, — сообщение WM_PAINT. Операционная система Windows посылает это сообщение окну приложения (точнее— объекту, представляющему окно) при любой; операции, требующей перерисовки изображения в окне. Несколько событий могут стать причиной возникновения необходимости в такой перерисовке.

•Первое из них — запуск программы. В правильно организованной Windows-программе окно приложения получает сообщение WM_PAINT практически немедленно после запуска с тем, чтобы данные, соответствующие исходному состоянию приложения, сразу же были предъявлены пользователю.

•Другое событие, требующее перерисовки окна, а значит, и генерирующее сообщение WM_PAINT, — изменение размеров окна или перекомпоновка окон на экране. В последнем случае окно приложения может стать верхним или быть частично перекрытым другим окном. В любом случае приоткрывается хотя бы часть окна и изображение в нем должно быть перерисовано.

•И наконец, программа может посылать сообщение WM_PAINT сама себе с тем, чтобы удалить старые данные на экране и вывести новые. Такая возможность позволяет приложению всегда держать пользователя в курсе происходящих событий. Например, текстовый процессор может стереть на экране старый текст сразу же после вставки некоторого фрагмента текста из системного буфера.

Когда будем рассматривать карту сообщений, мы познакомимся с соглашением о преобразовании идентификатора сообщения в имя макроса карты сообщений и имя функции. Для сообщения - WM_PAINT , соответствующий макрос будет называться ON_WM_PAINT(), а соответствующая функция— OnPaint(). Это пример того, как MFC берет на себя значительную часть работы по соотнесению сообщений Windows с функциями их обработки.

Текст функции CView::OnPaint() представлен ниже.

void CView::OnPaint()

зн// Стандартная последовательность вызовов для прорисовки.

CPaintDC dc(this);

OnPrepareDC(&dc);

OnDraw(&dc);

зн

Класс CPaintDC — это специальный класс для управления контекстами отрисовки (paint DCs) — контекстами устройств, которые используются только для реакции на сообщения WM_PAINT. Объект класса CPaintDC делает нечто большее, чем просто создание контекста устройства. Он также вызывает BeginPaint() — функцию Windows API — в конструкторе класса и функцию EndPaint() — в деструкторе. В процессе реакции на сообщение WM_PAINT необходимо вызывать и BeginPaint(), и EndPaint(). Класс CPaintDC избавляет вас от необходимости заботиться о таких мелочах. Конструктор класса CPaintDC требует одного аргумента— указателя на объект, представляющий окно, для которого и создается контекст устройства. Указатель this указывает на текущее окно, т.е. конструктору дается задание создать контекст для текущего окна.

Функция ОnРгерагеDС() является членом класса CView. Она подготавливает контекст устройства для дальнейшего использования.

Функция OnDraw() берет на себя всю работу по обновлению представления документа на экране. В большинстве случаев для каждого приложения нужно разрабатывать собственную функцию OnDraw() и никогда не вносить изменений в предлагаемый MFC текст функции OnPaint().

Изменение размеров и положения окна

В программе, использующей MFC,  можно изменить размеры и положение окна с помощью функции PreCreateWindowO— члена класса главного окна приложения. Она вызывается автоматически перед началом формирования главного окна приложения. В главном окне содержатся все видимые объекты приложения и определяется размер представления.

Функция PreCreateWindow() имеет один аргумент— ссылку на экземпляр структуры CREATESTRUCT. Эта структура содержит всю информацию об окне, которое должно появиться на экране.

Если при создании приложения Windows вы не будете пользоваться библиотекой MFC, то со структурой CREATESTRUCT столкнетесь при обращении к функции API CreateWindow(), которая формирует окно приложения. Особое внимание тех, кто программирует с помощью MFC, привлекают члены сх, су, х и у. Изменяя сх и су, можно регулировать ширину и высоту окна, а изменяя х и у, — положение окна на экране. Перегрузив функцию PreCreateWi ndow(), вы получаете шанс пообщаться со структурой CREATESTRUCT еще до того, как Windows использует ее для формирования окна.

AppWizard уже создал CMainFrame:: PreCreateWindow(). Так что можете развернуть класс СМаin Frame в окне ClassView, дважды щелкнуть на названии PreCreateWindow() и отредактировать текст функции— включить в нее фрагмент:

 

BOOL CMainFrame: : PreCreateWindow(CREATESTRUCT& cs)

зн  cs.cx = 440;

cs.cy = 480;

if(!CFrameWnd::PreCreateWindow(cs)) return FALSE;

return TRUE;зн

 

Эти операторы устанавливают новые высоту и ширину окна приложения.


18.01.2020; 20:25
хиты: 52
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь