Создание простейшего графического редактора (Лабораторная работа № 20 по VisualC++ 2005), страница 6

После этого можно старый метафайл заменить новым и удалить старый.В результате мы воспроизвели графическое изображение в клиентской области и создали новый метафайл для следующего обновления.

Примечание:

Если вы используете графические методы,возвращающие информацию о контексте устройства(например, сведения о высоте или ширине), то воспроизведение метафайла в другом контексте может быть неудачным (поскольку размеры не обязательно останутся прежними). Чтобы связать метафайл с контекстом устройства того типа, в котором он должен воспроизводиться, нужно использовать метод SetAttirDC() класса CMetaFileDC .

Изображение, находящееся в метафайле, можно сохранить на диске.

15) Сохранение графических файлов.

Используется метод CopyMetaFile()  класса CMetaFileDC.

          Связать обработчики с тремя командами меню File- New, Save  и Open. Они будут создавать новый документ программы  graf_painter, сохранять изображение в файле graf_painter.wmf  ( это стандартное расширение для метафайлов) и загружать сохраненный ранее метафайл.

а) Открыть метод OnFileSave() и заполнить его.

void Cgraf_painterView::OnFileSave()

{

Cgraf_painterDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

HMETAFILE Nomer=pDoc->pMetaFileDC->Close();

CopyMetaFile(Nomer,"graf_painter.wmf");

CMetaFileDC*Newmetafile=new CMetaFileDC();

Newmetafile->Create();

Newmetafile->PlayMetaFile(Nomer);

DeleteMetaFile(Nomer);

delete pDoc->pMetaFileDC;

pDoc->pMetaFileDC=Newmetafile;

     // TODO: Add your command handler code here

}

Как и в предыдущем случае, вначале закрыли метафайл, чтобы узнать его логический номер. Затем скопировали его на диск в файл graf_painter.wmf. Далее создается новый метафайл и воспроизводится в нем старый. Заменяется старый метафайл новым, после чего старый удаляется.

б)  Заполнить обработчик, обеспечивающий загрузку графического файла.

Будет использоваться метод GetMetaFile().

void Cgraf_painterView::OnFileOpen()

{

     Cgraf_painterDoc*pDoc=GetDocument();

     ASSERT_VALID(pDoc);

     HMETAFILE Nomer=GetMetaFile("graf_painter.wmf"); //создается новый логический номер метафайла

     CMetaFileDC*Newmetafile=new CMetaFileDC();

     Newmetafile->Create();

     Newmetafile->PlayMetaFile(Nomer);

     DeleteMetaFile(Nomer);

     delete pDoc->pMetaFileDC;

     pDoc->pMetaFileDC=Newmetafile;

     Invalidate();//Обеспечивает отображение нового метафайла в объекте вида программы

     // TODO: Add your command handler code here

}

Как и раньше, по номеру создаем новый объект класса CMetaFileDC, воспроизводим в нем файл, загруженный с диска, заменяем старый метафайл новым. Метод Invalidate() обеспечивает отображение нового метафайла в объекте вида.

в)  Заполнить обработчик , создающий новый документ.

          Выбирая команду File  -> New, пользователь хочет создать новый документ. Поэтому мы создаем пустой метафайл, устанавливаем его в своей программе и вызываем Invalidate() для его воспроизведения. Метод  Invalidate() очищает окно вида, и пользователь может приступить к созданию нового изображения в пустом окне  и в пустом метафайле.

void Cgraf_painterView::OnFileNew()

{

    Cgraf_painterDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

CMetaFileDC*newMetaFile=new CMetaFileDC();

newMetaFile->Create();

delete pDoc->pMetaFileDC;

pDoc->pMetaFileDC=newMetaFile;

Invalidate();

    // TODO: Add your command handler code here

}

3 Контрольные вопросы

1Как растянуть линию?

2 Что такое бинарные растровые операции?

3 Что такое метафайл и зачем он нужен?

4 Как воспроизвести метафайл?

5 Как сохранить графический файл?

6 Как открыть графический файл?

7 Как нарисовать  прямоугольник?

8 Как создать новый документ?

Список литературы

1 С. Холзнер VISUAL C++ 6. Учебный курс, «Питер», Санкт-Петербург, Москва, Харьков, Минск, 2001г.

2 Айвор Хортон  VISUAL C++ 2005 Базовый курс, «Диалектика», Москва, Санкт-Петербург, Киев , 2007г