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

Создание метафайла и работа сним

Следующий пример позволит понять принципы работы с метафайлами:

#include<stdio.h>

#include<stdlib.h>

#include <afxext.h>

* * *

CMetaFileDC *dc=new CMetaFileDC();

* * *

VERIFY(dc->Create("geometry.wmf"));

/*установка режима и размеров созданного метафайла*/

dc->SetMapMode(MM_ANISOTROPIC);

dc->SetWindowOrg(0,0);

dc->SetWindowExt(5000,5000);

/* создадим карандаш зеленого цвета с толщиной линии 10*/

CPen pen(PS_SOLID,10,RGB(255,0,0));

dc->SelectObject(&pen);

/* нарисуем эллипс/*

dc->Ellipse(100,100,1000,1000);

HMETAFILE hMF=dc->Close();

ASSERT(hMF!=NULL);

* * *

Задания:

Задача состоит в изображении геометрических фигур, описанных в файле либо введенных в поле ввода данных программы. Данные при этом могут быть представлены некорректно: возможно использование множества пробелов, переводов строк, знаков табуляций в любом месте до, после и внутри скобок, задающих координаты фигур. Требуется корректно разобрать текст и, создав метафайл (.wmf), нарисовать в нем фигуры с учетом координат. Координаты при этом могут быть представлены в виде выражений с использованием операций сложения, вычитания, умножения, деления с использованием в них скобок. В данных возможны ошибки, например, три координаты вместо четырех.

Например, может быть задано:

line(2, 56+4-45 , 35 , 35+254) ellipse

(74-56, 34, 234-115 , 46)

В этом случае на экране должны появиться линия с координатами вершин (2, 15) и (35, 289) и эллипс (18, 34, 134, 46).

Порядок выполнения работы:

  1. Запустить MSVisualC++, создать приложение «Lexer and Parser AppWizard» (например, Example).

  2. Настроить входной поток: в функции main при создании парсера указать входной файл, в lex-файле (.l) заменить функцию getchar() на getc(yyin) (yy заменяется названием вашего проекта – Examplein).

  3. В функции main создать объект класса CmetaFileDC и настроить его.

  4. После вызова парсера закрыть мета-файл.

  5. В lex-файле (.l) выделить необходимые лексемы (например, Line).

  6. C помощью переменной yylval, которой присваивается определенное значение лексемы и массива yytext передать парсеру значение выделенной лексемы.

  7. Определить тип лексем и их имена в разделе %token.

  8. В разделе %type указать тип и имена нетерминальных символов.

  9. В разделе %start указать имя начального нетерминального символа.

  10. В разделе правил указать нетерминальные символы и действия над ними с учетом возможных ошибок данных (error).

  11. С помощью функций рисования создать необходимые объекты в созданном мета-файле.

  12. Нажав правую клавишу миши и выбрав соответствующий пункт, откомпилировать lex-файл и запустить приложение.

  13. С помощью MSWord или другой программы просмотреть результат.

Таблица 8 ─ Варианты заданий на лабораторную работу №4

Задания

Вариант

Формат, задающий вид и координаты фигур, следующий:

Line(x1, y1, x2, y2)

Polyline(x1, y1, x2, y2, …, xn, yn)

Ellipse(x1, y1, x2, y2)

1

Формат, задающий вид и координаты фигур, следующий:

Polyline(x1, y1, x2, y2, …, xn, yn)

Circle(x, y, r)

Rectangle(x1, y1, x2, y2)

2