Данная обработка содержит набор методов для создания векторных картинок в формате WMF.
WMF - векторный формат, состоящий из команд, практически повторяющих Windows GDI API. Векторное изображение для простых рисунков занимает меньше места по сравнению с растровым, отображается быстрее и отлично масштабируется.
Данная реализация содержит не все команды. Я не включал команды работы с палитрой (за неактуальностью) и с регионами (из-за определенной бедности и муторности по сравнению с WinAPI). Некоторые команды или параметры команд не поддерживаются приложениями. В частности, мне не удалось указать межсимвольный интервал или задать поворот символов относительно оси рисования. При желании можно добавить любую команду, вооружившись описанием формата - официальное описание тут: http://msdn.microsoft.com/en-us/library/cc250370.aspx
Стоит учитывать что почти все параметры задаются 16-разрядными словами.
Сразу предупреждаю - не следует полагаться на "умолчания" - тестовая картинка в 1С, ACDSee и WinWord выглядела по-разному пока все возможные параметры не были уточнены.
Система координат по умолчанию - влево и вниз. Создаваемая картинка предполагает что отсчет начинается с 0,0. Единицы измерения достаточно условны, особенно с учетом что картинка может масштабироваться. В создаваемой картинке я указываю рекомендуемую плотность 1440 точек на дюйм (стандартное разрешение), что при стандартном отношении 96 точек/дюйм для экрана даст 15 WMF-точек на пиксель.
Для рисования требуется создавать объекты PEN ("ручка","карандаш") - для линий, BRUSH ("кисть") - для закрашивания, FONT - шрифт. При создании ручки и кисти указывается их цвет и узор. Для описания шрифта я использую стандартный объект "Шрифт". Свойство "Размер" указывает на высоту шрифта в условных единицах. Можно заранее создать несколько кистей и других объектов, по мере необходимости подключая нужную функцией SelectObject(). Функции создания объектов возвращают номер, который требуется использовать в функции ВекторнаяКартинкаSelectObject()
Все замкнутые фигуры рисуют границу стилем PEN и заливаются стилем BRUSH. Если выбран стиль кисти Штриховка, то указывается СтильШтриховки. Следует ли затирать то что находится под текстом или штриховой заливкой и как, регулируется функциями фона: SETBKMODE, SETBKCOLOR.
Текст выводится в кодировке Win-1251, перекодирую из строки автоматически. Так же для TEXTOUT можно указать в качестве параметра "текст" массив байт-кодов символов.
Основные используемые константы я вынес в Структуры: СтильКарандаш для создания PEN, СтильКисть и СтильШтриховки для создания BRUSH, ВыводТекста, ВыравниваниеТекста и ВыводФона для отображения текста.
Для указания цветов я использую объект Цвет, заданный цветовыми компонентами (Абсолютный)
Можно вставить растровую картинку с изменением пропорций (последняя функция).
Для начала работы требуется создать объект с указанием планируемой ширины и высоты в условных единицах функцией
Функция СоздатьВекторнуюКартинку(Ширина,Высота) Экспорт
После формирования картинки её можно вывести в ДвоичныйПоток:
Функция ВекторнаяКартинкаСохранитьВДанные(картинка) Экспорт
В файл:
Процедура ВекторнаяКартинкаСохранитьВФайл(картинка,ИмяФайла) Экспорт
Для получения системного объекта Картинка требуется:
поток=ВекторнаяКартинкаСохранитьВДанные(к);
Картинка1=Новый Картинка(поток);
Создание объектов:
//Создать объект PEN для рисования линий
Функция ВекторнаяКартинкаCREATEPENINDIRECT(картинка,Стиль,Толщина,Цвет) Экспорт
//Создать объект BRUSH для заливки
Функция ВекторнаяКартинкаCREATEBRUSHINDIRECT(картинка,Стиль,знач Цвет=Неопределено,знач Штриховка=0) Экспорт
//Создание объекта "Шрифт" в картинке
//@шрифт - объект Шрифт
//@Ширина - подбор ширины символов, 0 - авто
//@Поворот - угол наклона шрифта в градусах
//@ПоворотЗнаков - угол наклона символов. По умолчанию совпадает с наклоном шрифта
//@Кодировка - значение CharSet из стандарта WMF. 0 - Ansi, 1 - по умолчанию, 204 - русский
//@Подбор - значение OutPrecision Enumeration
//@ПодборОбрезания - значение ClipPrecision Flags
//@Качество - значение FontQuality Enumeration
//@Семейство - значение PitchAndFamily = FamilyFont + PitchFont*64
Функция ВекторнаяКартинкаCREATEFONTINDIRECT(картинка,шрифт,Ширина=0,Поворот=0,знач ПоворотЗнаков=Неопределено,Кодировка=1,Подбор=0,ПодборОбрезания=0,Качество=0,Семейство=0) Экспорт
Функции рисования:
//Рисование прямоугольника с заливкой
Процедура ВекторнаяКартинкаRECTANGLE(картинка,х1,у1,х2,у2) Экспорт
//Рисование прямоугольника с заливкой с закругленными краями, ширина и высота задают степень скругления
Процедура ВекторнаяКартинкаROUNDRECT(картинка,х1,у1,х2,у2,ширина,высота) Экспорт
//Рисует дугу эллипса выбранным PEN, дуга задается пересечением эллипса,
//заданного описанным прямоугольником (ПрХ1,ПрУ1)-(ПрХ2,ПрУ2)
//и пересекающими его отрезками из центра к точкам (ОХ1,ОУ1) и (ОХ2,ОУ2)
Процедура ВекторнаяКартинкаARC(картинка,ПрХ1,ПрУ1,ПрХ2,ПрУ2,ОХ1,ОУ1,ОХ2,ОУ2) Экспорт
//Рисует усеченный эллипс с заливкой, дуга задается пересечением эллипса,
//заданного описанным прямоугольником (ПрХ1,ПрУ1)-(ПрХ2,ПрУ2)
//и пересекающими его отрезками из центра к точкам (ОХ1,ОУ1) и (ОХ2,ОУ2)
Процедура ВекторнаяКартинкаCHORD(картинка,ПрХ1,ПрУ1,ПрХ2,ПрУ2,ОХ1,ОУ1,ОХ2,ОУ2) Экспорт
//Рисует сектор эллипса, дуга задается пересечением эллипса,
//заданного описанным прямоугольником (ПрХ1,ПрУ1)-(ПрХ2,ПрУ2)
//и пересекающими его отрезками из центра к точкам (ОХ1,ОУ1) и (ОХ2,ОУ2)
Процедура ВекторнаяКартинкаPIE(картинка,ПрХ1,ПрУ1,ПрХ2,ПрУ2,ОХ1,ОУ1,ОХ2,ОУ2) Экспорт
//Рисует эллипс выбранным PEN с заливкой BRUSH,
//заданный описанным прямоугольником (ПрХ1,ПрУ1)-(ПрХ2,ПрУ2)
Процедура ВекторнаяКартинкаELLIPSE(картинка,ПрХ1,ПрУ1,ПрХ2,ПрУ2) Экспорт
//Закрашивает область выбранной BRUSH,
//Указываются координаты начала заливки, цвет и режим - 0 - до цвета границы, 1 - область указанного цвета
Процедура ВекторнаяКартинкаEXTFLOODFILL(картинка,Х,У,цвет,режим=0) Экспорт
//Перемещение текущей точки
Процедура ВекторнаяКартинкаMOVETO(картинка,х,у) Экспорт
//Рисование отрезка от текущей точки до указанных координат
Процедура ВекторнаяКартинкаLINETO(картинка,х,у) Экспорт
//Рисование ломаной, параметр "точки" - двумерный массив[][2] точек
Процедура ВекторнаяКартинкаPOLYLINE(картинка,точки) Экспорт
//Рисование многоугольника, параметр "точки" - двумерный массив[][2] точек
Процедура ВекторнаяКартинкаPOLYGON(картинка,точки) Экспорт
//Установить пиксель по заданным координатам
Процедура ВекторнаяКартинкаSETPIXEL(картинка,Х,У,цвет) Экспорт
Вывод текста:
//Вывод текста
Процедура ВекторнаяКартинкаTEXTOUT(картинка,х,у,текст) Экспорт
//Вывод текста с возможностью обрезки и указания межсимвольных отступов
Процедура ВекторнаяКартинкаEXTTEXTOUT(картинка,х,у,текст,опции=0,ПрХ1=0,ПрУ1=0,ПрХ2=0,ПрУ2=0,отступы=Неопределено) Экспорт
//Установить фоновый цвет
Процедура ВекторнаяКартинкаSETBKCOLOR(картинка,цвет) Экспорт
//Установить режим фона из ВыводФона
Процедура ВекторнаяКартинкаSETBKMODE(картинка,режим) Экспорт
//Установить режим выравнивания текста из ВыравниваниеТекста
Процедура ВекторнаяКартинкаSETTEXTALIGN(картинка,режим) Экспорт
//Установить цвет текста
Процедура ВекторнаяКартинкаSETTEXTCOLOR(картинка,цвет) Экспорт
//Отобразить растровую картинку с возможным сжатием/увеличением
//@ИсходнаяКартинка - системный объект Картинка формата BMP/JPG/PNG/GIF/TIFF/Icon
Процедура ВекторнаяКартинкаSTRETCHDIB(картинка,ИсходнаяКартинка,ИсхХ,ИсхУ,знач ИсхШирина=0,знач ИсхВысота=0,ЦельХ,ЦельУ,ЦельШирина,ЦельВысота) Экспорт
Картинка в заголовке сформирована следующей процедурой:
к=СоздатьВекторнуюКартинку(15*400,15*200);
Белый=Новый Цвет(255,255,255);
Черный=Новый Цвет(0,0,0);
Красный=Новый Цвет(255,0,0);
Зеленый=Новый Цвет(0,255,0);
Голубой=Новый Цвет(128,128,255);
Синий=Новый Цвет(0,0,255);
Желтый=Новый Цвет(255,255,0);
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEFONTINDIRECT(к,Новый Шрифт("Arial",15*25,Ложь,Истина,Истина,Ложь),15*6,0));
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEPENINDIRECT(к,СтильКарандаш.Невидимый,0,Белый));
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEBRUSHINDIRECT(к,СтильКисть.Сплошной,Голубой));
ВекторнаяКартинкаRECTANGLE(к,0,0,15*400-1,15*200-1);
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEBRUSHINDIRECT(к,СтильКисть.Сплошной,Зеленый));
ВекторнаяКартинкаRECTANGLE(к,0,15*100,15*400-1,15*200-1);
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEBRUSHINDIRECT(к,СтильКисть.Сплошной,Желтый));
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEPENINDIRECT(к,СтильКарандаш.Сплошной,15*2,Желтый));
ВекторнаяКартинкаELLIPSE(к,15*300,15*30,15*370,15*70);
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
ВекторнаяКартинкаLINETO(к,15*335,15*10);
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
ВекторнаяКартинкаLINETO(к,15*335,15*90);
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
ВекторнаяКартинкаLINETO(к,15*310,15*15);
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
ВекторнаяКартинкаLINETO(к,15*360,15*15);
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
ВекторнаяКартинкаLINETO(к,15*310,15*85);
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
ВекторнаяКартинкаLINETO(к,15*360,15*85);
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
ВекторнаяКартинкаLINETO(к,15*310,15*15);
ВекторнаяКартинкаARC(к,15*270,15*40,15*300,15*60,15*300,15*50,0,0);
ВекторнаяКартинкаARC(к,15*370,15*40,15*400,15*60,15*400,15*40,15*370,15*50);
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEBRUSHINDIRECT(к,СтильКисть.Штриховка,Красный,СтильШтриховки.КосойКрест));
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEPENINDIRECT(к,СтильКарандаш.Сплошной,0,Синий));
ВекторнаяКартинкаSETBKCOLOR(к,Синий);
ВекторнаяКартинкаCHORD(к,15*10,15*10,15*40,15*40,15*35,15*50,15*35,15*0);
ВекторнаяКартинкаPIE(к,15*50,15*10,15*80,15*40,15*80,15*10,15*80,15*40);
точки1=Новый Массив(5,2);
Pi = 3.1415926535897932;
Для н=0 по 4 цикл
точки1[н][0]=Окр(Cos((360/5*н-90)/180*pi)*15*10)+15*100;
точки1[н][1]=Окр(Sin((360/5*н-90)/180*pi)*15*10)+15*20;
КонецЦикла;
точки2=Новый Массив(6,2);
Для Н=0 по 5 цикл
точки2[н][0]=Окр(Cos((360/5*н*2-90)/180*pi)*15*10)+15*100;
точки2[н][1]=Окр(Sin((360/5*н*2-90)/180*pi)*15*10)+15*40;
КонецЦикла;
ВекторнаяКартинкаPOLYGON(к,точки1);
ВекторнаяКартинкаPOLYLINE(к,точки2);
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEBRUSHINDIRECT(к,СтильКисть.Сплошной,Голубой));
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEPENINDIRECT(к,СтильКарандаш.Штрих,15*2,Новый Цвет(190,128,255)));
ВекторнаяКартинкаRECTANGLE(к,15*30,15*110,15*100,15*140);
ВекторнаяКартинкаROUNDRECT(к,15*330,15*150,15*380,15*180,15*10,15*10);
ВекторнаяКартинкаSETBKMODE(к,ВыводФона.Прозрачный);
ВекторнаяКартинкаSETTEXTALIGN(к,ВыравниваниеТекста.ПравоНиз);
ВекторнаяКартинкаSETTEXTCOLOR(к,Красный);
ВекторнаяКартинкаTEXTOUT(к,15*390,15*190,"Автор Pasha1st");
поток=ВекторнаяКартинкаСохранитьВДанные(к);
//поток.Записать("E:\2.wmf");
ЭтаФорма.ЭлементыФормы.ПолеКартинки1.Картинка=Новый Картинка(поток);
ЭлементыФормы.ПолеКартинки1.Масштабировать=Истина;
Предлагаю так же оценить аналогичный модуль рисования растровой картинки - BMP: //infostart.ru/public/310668/