There is no direct possibility to render a map to a Metafile (WMF) in the DK.NET. There is, however, an easy way to subclass TGIS_RendererWinforms:
public class TGIS_RendererWMF : TGIS_RendererWinForms
{
/// <summary>
/// Print a current map view to a WMF
/// </summary>
/// <param name="_parent">Reference to a GIS viewer</param>
/// <param name="_viewer">Reference to a GIS viewer. Same a _parent!</param>
/// <param name="_stream">output stream</param>
static public void PrintGisViewer(IGIS_ViewerParent _parent, IGIS_Viewer _viewer, System.IO.Stream _stream)
{
TatukGIS.NDK.WinForms.TGIS_RendererWinForms rnd;
TGIS_RendererContext ctx;
System.Drawing.Imaging.Metafile met;
System.Drawing.Imaging.Metafile met1;
System.Drawing.Imaging.Metafile met2;
System.Drawing.Imaging.Metafile met3;
System.Drawing.Imaging.Metafile met4;
Graphics img;
System.IO.MemoryStream mem1;
System.IO.MemoryStream mem2;
System.IO.MemoryStream mem3;
System.IO.MemoryStream mem4;
IntPtr dc;
Graphics grp;
grp = Graphics.FromHwnd((IntPtr)0);
dc = grp.GetHdc();
ctx = null;
mem1 = null;
mem2 = null;
mem3 = null;
mem4 = null;
met1 = null;
met2 = null;
met3 = null;
met4 = null;
try
{
mem1 = new System.IO.MemoryStream();
met1 = new System.Drawing.Imaging.Metafile(
mem1, dc,
new Rectangle(0, 0, _parent.ControlCanvasWidth(), _parent.ControlCanvasHeight()),
System.Drawing.Imaging.MetafileFrameUnit.Pixel
);
mem2 = new System.IO.MemoryStream();
met2 = new System.Drawing.Imaging.Metafile(
mem2, dc,
new Rectangle(0, 0, _parent.ControlCanvasWidth(), _parent.ControlCanvasHeight()),
System.Drawing.Imaging.MetafileFrameUnit.Pixel
);
mem3 = new System.IO.MemoryStream();
met3 = new System.Drawing.Imaging.Metafile(
mem3, dc,
new Rectangle(0, 0, _parent.ControlCanvasWidth(), _parent.ControlCanvasHeight()),
System.Drawing.Imaging.MetafileFrameUnit.Pixel
);
mem4 = new System.IO.MemoryStream();
met4 = new System.Drawing.Imaging.Metafile(
mem4, dc,
new Rectangle(0, 0, _parent.ControlCanvasWidth(), _parent.ControlCanvasHeight()),
System.Drawing.Imaging.MetafileFrameUnit.Pixel
);
ctx = new TGIS_RendererContext();
ctx.AssignBaseMap(
met1,
false
);
ctx.AssignSelection(
met2,
false
);
ctx.AssignCharts(
met3,
false
);
ctx.AssignLabels(
met4,
false
);
rnd = new TatukGIS.NDK.WinForms.TGIS_RendererWinForms();
rnd.CreateContext(_parent, _viewer, ctx, new Point(0, 0), _parent.ControlCanvasWidth(), _parent.ControlCanvasHeight(), 96, 100);
_viewer.LabelsReg.Reset();
rnd.BeforeDraw();
_viewer.Draw(rnd, TatukGIS.NDK.TGIS_DrawMode.All);
rnd.AfterDraw();
rnd.ReleaseContext();
}
finally
{
ctx.Dispose();
met1.Dispose();
met2.Dispose();
met3.Dispose();
met4.Dispose();
}
met = null;
img = null;
try
{
met = new System.Drawing.Imaging.Metafile(
_stream, dc,
new Rectangle(0, 0, _parent.ControlCanvasWidth(), _parent.ControlCanvasHeight()),
System.Drawing.Imaging.MetafileFrameUnit.Pixel
);
img = Graphics.FromImage(met);
mem1.Position = 0;
met1 = new System.Drawing.Imaging.Metafile(mem1);
img.DrawImage(met1, 0, 0);
met1.Dispose();
mem1.Dispose();
mem2.Position = 0;
met2 = new System.Drawing.Imaging.Metafile(mem2);
img.DrawImage(met2, 0, 0);
met2.Dispose();
mem2.Dispose();
mem3.Position = 0;
met3 = new System.Drawing.Imaging.Metafile(mem3);
img.DrawImage(met3, 0, 0);
met3.Dispose();
mem3.Dispose();
mem4.Position = 0;
met4 = new System.Drawing.Imaging.Metafile(mem4);
img.DrawImage(met4, 0, 0);
met4.Dispose();
mem4.Dispose();
}
finally
{
img.Dispose();
met.Dispose();
}
grp.Dispose();
}
}
Now creating a WMF file is possible with this code:
System.IO.FileStream strm = System.IO.File.Create(@"myfile.wmf");
TGIS_RendererWMF.PrintGisViewer(GIS, GIS, strm);
strm.Close();