我希望以前没有问过这个问题。我找不到这方面的具体内容。我有一个复杂的自定义绘制表单,我将使用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"图形对象。
答案 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);
}