如何导出WinForm 控件界面的矢量图

调用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界面设计,以便于您获取更多的相关知识。

时间: 2025-01-01 21:05:10

如何导出WinForm 控件界面的矢量图的相关文章

winform如何生成界面的矢量图,大神帮忙,急,在线等

问题描述 如何生成一个winform界面的矢量图,是整个界面,就是说界面是什么样子,生成的图片就是什么样子,最好是矢量图,因为矢量图无限放大不会失真,我现在调用的是form1.DrawToBitmap()这个方法可以生成界面的图片,但不是矢量图,放大会失真,那怎么样才能生成界面的矢量图呢,求大神解决,最好贴上代码,万分感谢!如果实在生成不了矢量图,那么怎么生成指定分辨率的界面图片,最好是矢量图了! 解决方案 解决方案二:哥哥姐姐帮帮忙哦,急解决方案三:界面的截图图怎么会是矢量图呢截屏方法>htt

WinForm控件开发总结(十二) 让控件处理导航键

最近真的真的太忙了,以至于一个多月都没哟更新我的blog.昨天晚上,一个网上的朋友看了我的 ToolBox的文章,问我一个问题,他说如何让ToolBox控件也能响应键盘操作,也就是用Up,down按键来选 择工具箱控件里的Item,他添加了键盘事件,但是不起作用.一开始做这个控件的时候也只是演示一下控 件的制作过程,只用了很短的时间做了一个,只考虑了用鼠标选取,没有考虑键盘操作,我想要添加键盘 操作无非重载KeyDown事件,针对Up,Down做一些响应就可以了.可是添加了重载了OnKeyDow

多线程-新人求思路 winform控件自动刷新

问题描述 新人求思路 winform控件自动刷新 需求:定义自动刷新接口IAO,有若干控件(记为arc)实现该接口 包含arc的接口load时注册arc及其数据源的映射到某个集合(对控件采用弱引用,记为ard) 数据服务层更新数据后遍历集合 向需要进行UI更新的arc发送消息 窗体上的arc采用多线程异步处理更新操作(例:实现IAO的下拉列表arcombobox在收到消息后下拉框中的选项发生改变) 涉及的技术比较多 思路有点乱 控件与数据源的映射方式和与服务层交互的信息应该怎样定义都想不明白 希

.Net(C#)自定义WinForm控件之小结篇(强力推荐)

强力推荐的网站:http://www.myfirm.cn/News/dotNetGUIAPI/ 本文转载:http://www.myfirm.cn/News/dotNetUserInterface/20080216063648402.html 写在前面: .Net已经成为许多软件公司的选择,而.Net自定义WinForm界面控件,也成为编程的热点,越来越多的程序员会开发自己需要的自定义界面控件.小作坊网介绍了多种自定义的界面控件,基本了包括了日常所需的各种基本控件,介绍的自定义控件,都对原有的界

C# WinForm控件、自定义控件整理(大全)

转:http://www.cnblogs.com/top5/archive/2010/04/29/1724039.html 对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, 不断补充充实, 完善这方面. 基础 - 常用控件 C# WinForm开发系列 - CheckBox/Button/Label/ProgressBar WinForm下CheckedListBox的数据绑定 Winform 下无闪烁走马灯效果实现 c#,winform,progressbar+la

在IE中使用VS.net WinForm控件

控件 在Visual Studio .net中,类似于Applet或ActiveX控件,WinForm控件可以嵌入IE中使用.嵌入IE的Windows窗体控件不要求注册,不需用户提示即可激活.我们可以很方便地实现一些WebForm中实现起来相对麻烦的交互操作,结合.net Remoting等技术访问后台数据库,则可生成功能强大而且美观的WebForm页面. 使用该技术,需要客户端安装.net FrameWork及IE 6.0,在Windows 2003中已经自带了.net FrameWork.

导出CListCtrl控件到Excel文件

CListCtrl获得列的属性可以使用BOOL CListCtrl::GetColumn( int nCol, LVCOLUMN* pColumn ),nCol为需要获得获得属性值的列序号,pColumn 为 LVCOLUMN 结构体的指针.LVCOLUMN结构体中的 UINT mask 作为输入,决定返回哪些属性的值,如果 mask 的值包含 LVCF_TEXT ,则需要将字符串缓存的首地址指针置入结构体中的 LPTSTR pszText; 变量,缓存大小置入 int cchTextMax;

WPF案例(五) 对控件界面使用倒影

在这个程序里对5个2D控件界面应用了垂直倒影,边缘模糊化和模型变换,在本例中,这5个2D控件为Border, 各包含了一幅Image,界面 如下图所示,源码从这里(http://files.cnblogs.com/5460600/DropShadow.rar)下载 本例中使用Viewport2DVisual3D来呈现2D的Border,Border中包含了Image,对 Viewport2DVisual3D使用了RotateTransform3D模型变换 ,以使Viewport2DVisual3

c#扩展方法奇思妙用高级篇六:WinForm控件选择器

我们先看几个类图,深入认识一下我们常用的WinForm控件: 图1 ScrollableControl类图 图2 ButtonBase类图 图3 TextBoxBase类图 图4 ListControl类图 图5 Label类图 图6 其它常用 从图1中可以看出,Form与Button.Label一样,也是一个Control.