调用Control.DrawToBitmap(Bitmap) 方法是很容易得到控件的图形的。 但是bitmap是栅格化图形。 栅格化图形有很多缺点,比如文件体积比较大、 放大后失真、 不易编辑等等。 这里教你如何导出一个 控件的矢量图。
I. Windows MetaFile.
windows MetaFile 是windows 下面的一种矢量图形格式。 事实上WMF 只是记录下来的一串GDI 命令 ,重新调用一次这一串GDI命令就可以重建之前记录下来的图像。而大部分windows应用程序的界面都是用 GDI绘制的,所以理论上都可以导出他们界面的矢量图。 详细去看: http://en.wikipedia.org/wiki/Windows_Metafile
II. 绘图表面 ( drawing surfaces )
用GDI+绘图的时候,基本上你会把图形绘制到 屏幕上的窗体、传到打印机的打印文档、内存里的图像 文件等等。 这些叫做绘图表面。
首先我们来创建一个新的EMF文件:
System.Drawing.Imaging.Metafile mf; Graphics g1 = control.CreateGraphics(); IntPtr hdc = g1.GetHdc(); mf = new Metafile(hdc, new Rectangle(0, 0, control.Width, control.Height), MetafileFrameUnit.Pixel, EmfType.EmfOnly); g1.ReleaseHdc(hdc); g1.Dispose();
Graphics g2 = Graphics.FromImage(mf);
调用WinApi把控件打印到此Graphics 对象上面(这个Graphics对象会作为参数传递给下面一级一级的 子控件的OnPaint()函数):
const int WM_PRINT = 0x0317; const int PRF_CHECKVISIBLE = 0x00000001, PRF_NONCLIENT = 0x00000002, PRF_CLIENT = 0x00000004, PRF_ERASEBKGND = 0x00000008, PRF_CHILDREN = 0x00000010; [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, int lParam); public static void DrawControl(Control control, Graphics g) { if (!control.Created) control.CreateControl(); IntPtr hDc = g.GetHdc(); SendMessage(new HandleRef(control, control.Handle), WM_PRINT, (int) hDc, (int)(PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND | PRF_NONCLIENT)); g.ReleaseHdc(hDc); }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索控件
, 图形
, graphics
, 矢量图
, gdi绘图打印的问题
, control
, 栅格
, mf控件关联
graphic界面
winform界面美化控件、winform 界面控件、winform 界面控件库、winform界面免费控件、winform界面设计,以便于您获取更多的相关知识。