Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
15 Мб
Скачать
☆

7.4.Класс cdrwView

Класс CDRWView сгенерирован мастером и специфичен для приложения DRW. (Как ВЫ уже догадались, мастер MVS строит имена классов на основе имени проекта, заданного Вами в его первом диалоговом окне.) Класс CDRWView находится внизу длинной цепочки наследования классов библиотеки MFC, как Вы могли видеть ранее на вкладке Class View. Наиболее важные базовые классы CDRWView – CWnd и CView. CWnd придает CDRWView свойства окна, a CView обеспечивает связь с остальными частями каркаса приложения, в частности, с документом и окном-рамкой приложения.

7.5.Рисование внутри окна представления: Windows gdi

Теперь Вы готовы к тому, чтобы написать код, который будет рисовать в окне представления. Вы внесете несколько изменений непосредственно в исходный текст DRW.

Функция-член OnDraw

Конкретнее, Вам понадобится наполнить реализацию функции OnDraw() в DRWView.cpp некоторым кодом. OnDraw() – это виртуальная функция-член класса CView, которую каркас приложения вызывает всякий раз, когда необходимо перерисовать окно представления. Перерисовка требуется, когда пользователь изменил размеры окна или открыл ранее невидимые его части, либо если само приложение изменило содержимое окна. В первых двух случаях OnDraw() вызывается каркасом приложения автоматически; однако, если данные окна изменены функцией внутри вашей программы, эта функция должна уведомить Windows об изменениях, вызвав унаследованную классом «вид» функцию-член Invalidate() (или InvalidateRect()). Код Invalidate() впоследствии вызовет OnDraw().

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

Контекст устройства в Windows

Windows не разрешает прямой доступ к аппаратуре дисплея, а взаимодействует с ней посредством абстракции под названием «контекст устройства» (device context), который связан с окном. В библиотеке MFC контекст устройства представлен в виде объекта класса C++ с именем CDC, который передается OnDraw() как параметр (посредством указателя). Имея указатель на CDC, Вы можете воспользоваться множеством функций класса CDC для рисования.

Добавление кода рисования в программу drw

Теперь напишем код, рисующий внутри окна представления текст и круг. Чтобы найти функцию OnDraw(), можно воспользоваться вкладкой ClassView (выберите и дважды щелкните OnDraw()) либо открыть исходный файл DRWView.cpp из FileView и отыскать функцию в тексте.

Шаг 5. Отредактируйте функцию OnDraw() в DRWView.cpp.

Сгенерированная мастером функция OnDraw()выглядит так:.

void CDRWView::OnDraw(CDC* /*pDC*/)

{

CDRWDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc) return;

// Доделать: добавьте код отображения своих данных

}

Обратите внимание, что имя параметра функции pDC мастер закомментировал, так как в заготовке функции он не используется. Не забудьте удалить этот комментарий.

Отредактируйте код функции следующим образом:

Вызов GetDocument() можно спокойно удалить вместе с другими операторами, содержащими ссылки на переменную pDOC, поскольку пока мы не собираемся работать с классом документ. Функции TextOut, SelectStockObject и Ellipse — члены класса контекста устройства CDC каркаса приложения. Функция Ellipse рисует круг, если длина ограничивающего прямоугольника равна его ширине.

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

Шаг 6. Перекомпилируйте и протестируйте приложение DRW.

Постройте приложение и, если нет ошибок компиляции, снова запустите программу. Теперь у Вас есть программа, работа которой сразу же видна! Попробуйте изменить размер окна программы, свернуть и восстановить окно. Изображение в окне не исчезает?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]