我希望之前没有人问过这个问题。在这方面我找不到任何具体的东西。我有一个复杂的自定义绘制表单,我可以使用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线程调用此代码。
如何使用自定义图形对象而不是常规的“在屏幕上绘制”图形对象来获取控件元素?
编辑:只是为了进一步澄清。一般来说,我对生成矢量图形没有任何问题。如果我只是开始在其中绘制形状甚至位图,那么MetaFile图形路径就可以正常工作。我面临的唯一问题是,我无法让我的UI控件使用图形对象,而不是默认的“打印到屏幕”图形对象。
发布于 2018-03-09 22:30:57
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);
}https://stackoverflow.com/questions/49146656
复制相似问题