Hi All!
Метафайлы в GDI+ это что-то!
Мало того, что вспотеешь их сохранять, так еще и нарисовать точно не получается!
Казалось бы — чего проще — создать картинку 10х10 и в ней 2 линии длиной 10 (это тестовый пример, который я создал изучая искажения в своём рисовании)
Описываю пример:
Создается метафайл 10х10 дюймов. Рисуестся 3 горизонтальных полоски от 0 до 10, 9, 8; 3 вертикальные полоски от 0 до 10, 9, 8 (все в дюймах)
Потом то же делается для пикселей, милиметров, поинтов,...
Результаты везде разные — либо линии уходят в горизонт либо не достают до края.
Теперь вопрос — что делать? Куда крестьянину податься? Как нарисовать точно (precisely)?
void DrawStrips(Graphics g1)
{
g1.DrawLine(Pens.Green, 0F, 1F, 10F, 1F);
g1.DrawLine(Pens.Green, 0F, 3F, 9F, 3F);
g1.DrawLine(Pens.Green, 0F, 5F, 8F, 5F);
g1.DrawLine(Pens.GreenYellow, 1f, 0f, 1f, 10f);
g1.DrawLine(Pens.GreenYellow, 3f, 0f, 3f, 9f);
g1.DrawLine(Pens.GreenYellow, 5f, 0f, 5f, 8f);
}
private void menuItem4_Click(object sender, System.EventArgs e)
{
RectangleF frame = new RectangleF(0f, 0f, 10f, 10f);
Metafile mf;
Graphics g1;
using(Graphics gr = CreateGraphics())
{
IntPtr dc = gr.GetHdc();
mf = new Metafile("c:\\document.emf", dc, frame, MetafileFrameUnit.Document, EmfType.EmfOnly);
gr.ReleaseHdc(dc);
}
g1 = Graphics.FromImage(mf);
g1.PageUnit = GraphicsUnit.Document;
DrawStrips(g1);
g1.Dispose();
mf.Dispose();
using(Graphics gr = CreateGraphics())
{
IntPtr dc = gr.GetHdc();
mf = new Metafile("c:\\inch.emf", dc, frame, MetafileFrameUnit.Inch, EmfType.EmfOnly);
gr.ReleaseHdc(dc);
}
g1 = Graphics.FromImage(mf);
g1.PageUnit = GraphicsUnit.Inch;
DrawStrips(g1);
g1.Dispose();
mf.Dispose();
using(Graphics gr = CreateGraphics())
{
IntPtr dc = gr.GetHdc();
mf = new Metafile("c:\\milimeter.emf", dc, frame, MetafileFrameUnit.Millimeter, EmfType.EmfOnly);
gr.ReleaseHdc(dc);
}
g1 = Graphics.FromImage(mf);
g1.PageUnit = GraphicsUnit.Millimeter;
DrawStrips(g1);
g1.Dispose();
mf.Dispose();
using(Graphics gr = CreateGraphics())
{
IntPtr dc = gr.GetHdc();
mf = new Metafile("c:\\pixel.emf", dc, frame, MetafileFrameUnit.Pixel, EmfType.EmfOnly);
gr.ReleaseHdc(dc);
}
g1 = Graphics.FromImage(mf);
g1.PageUnit = GraphicsUnit.Pixel;
DrawStrips(g1);
g1.Dispose();
mf.Dispose();
using(Graphics gr = CreateGraphics())
{
IntPtr dc = gr.GetHdc();
mf = new Metafile("c:\\point.emf", dc, frame, MetafileFrameUnit.Point, EmfType.EmfOnly);
gr.ReleaseHdc(dc);
}
g1 = Graphics.FromImage(mf);
g1.PageUnit = GraphicsUnit.Point;
DrawStrips(g1);
g1.Dispose();
mf.Dispose();
}