C#将表单绘制成MetaFile图形对象

时间:2018-03-07 07:47:20

标签: c# winforms vector-graphics zedgraph

我希望以前没有问过这个问题。我找不到这方面的具体内容。我有一个复杂的自定义绘制表单,我将使用C#中的MetaFile类保存为矢量图形(emf)。 不知何故,我无法让它发挥作用。我总是以一个1KB的空文件结束,也许有人可以告诉我我做错了什么。

到目前为止,这是我的代码。我错过了什么吗?

Graphics g = Graphics.FromImage(new Bitmap(this.Width, this.Height));
IntPtr hdc = g.GetHdc();

Metafile imageMetafile = new Metafile(filepath, hdc);

using (Graphics imageGraphics = Graphics.FromImage(imageMetafile)) 
{
       imageGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
       imageGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
       this.InvokePaint(this, new PaintEventArgs(imageGraphics, new Rectangle(0, 0, this.Width, this.Height)));
}

g.ReleaseHdc();
g.Dispose();

我从ZedGraph的源代码中获得了部分代码结构。然而,ZedGraph然后通过自己的Draw()方法提供所有东西,这些方法是winforms不具备的。这是我认为我可以使用InvokePaint来完成相同的结果但没有任何成功的地方。

作为旁注:此时我尝试绘制的控件元素已经在屏幕上,我从UI线程调用此代码。

如何让Control元素使用自定义图形对象而不是屏幕上的常规"绘图"图形对象?

编辑:只是为了进一步澄清。我一般都没有生成矢量图形的问题。如果我只是开始绘制形状甚至位图,MetaFile图形路径工作正常。我面临的唯一问题是我无法让我的UI控件使用THAT图形对象而不是默认的" print-to-screen"图形对象。

1 个答案:

答案 0 :(得分:0)

var imageMetafile = new Bitmap(this.Width, this.Height);

using (Graphics imageGraphics = Graphics.FromImage(imageMetafile))
{
    imageGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    imageGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    imageGraphics.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, this.Size);
    imageMetafile.Save(filepath);
}