知识大全 如何导出WinForm 控件界面的矢量图
Posted 知
篇首语:提兵百万西湖上,立马吴山第一峰!本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 如何导出WinForm 控件界面的矢量图相关的知识,希望对你有一定的参考价值。
如何导出WinForm 控件界面的矢量图 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
调用Control DrawToBitmap(Bitmap) 方法是很容易得到控件的图形的 但是bitmap是栅格化图形 栅格化图形有很多缺点 比如文件体积比较大 放大后失真 不易编辑等等 这里教你如何导出一个控件的矢量图
I Windows MetaFile
windows MetaFile 是windows 下面的一种矢量图形格式 事实上WMF 只是记录下来的一串GDI 命令 重新调用一次这一串GDI命令就可以重建之前记录下来的图像 而大部分windows应用程序的界面都是用GDI绘制的 所以理论上都可以导出他们界面的矢量图 详细去看 Windows_Metafile >_Metafile
II 绘图表面 ( drawing surfaces )
用GDI+绘图的时候 基本上你会把图形绘制到 屏幕上的窗体 传到打印机的打印文档 内存里的图像文件等等 这些叫做绘图表面
首先我们来创建一个新的EMF文件
System Drawing Imaging Metafile mf;
Graphics g = control CreateGraphics();
IntPtr hdc = g GetHdc();
mf = new Metafile(hdc new Rectangle( control Width control Height) MetafileFrameUnit Pixel EmfType EmfOnly);
g ReleaseHdc(hdc);
g Dispose();
Graphics g = Graphics FromImage(mf);
调用WinApi把控件打印到此Graphics 对象上面(这个Graphics对象会作为参数传递给下面一级一级的子控件的OnPaint()函数):
const int WM_PRINT = x ;
const int PRF_CHECKVISIBLE = x
PRF_NONCLIENT = x
PRF_CLIENT = x
PRF_ERASEBKGND = x
PRF_CHILDREN = x ;
[DllImport( user 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);
到这里已经得到了这个控件的矢量图了 下面附加一段代码把这个EMF复制到剪切板上面去
[DllImport( user dll )]
static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport( user dll )]
static extern bool EmptyClipboard();
[DllImport( user dll )]
static extern IntPtr SetClipboardData(uint uFormat IntPtr hMem);
[DllImport( user dll )]
static extern bool CloseClipboard();
[DllImport( gdi dll )]
static extern IntPtr CopyEnhMetaFile(IntPtr hemfSrc IntPtr hNULL);
[DllImport( gdi dll )]
static extern bool DeleteEnhMetaFile(IntPtr hemf);
static public bool PutEnhMetafileOnClipboard(IntPtr hWnd Metafile mf)
bool bResult = false;
IntPtr hEMF hEMF ;
hEMF = mf GetHenhmetafile(); // invalidates mf
if (!hEMF Equals(new IntPtr( )))
hEMF = CopyEnhMetaFile(hEMF new IntPtr( ));
if (!hEMF Equals(new IntPtr( )))
if (OpenClipboard(hWnd))
if (EmptyClipboard())
IntPtr hRes = SetClipboardData( /*CF_ENHMETAFILE*/ hEMF );
bResult = hRes Equals(hEMF );
CloseClipboard();
DeleteEnhMetaFile(hEMF);
return bResult;
cha138/Article/program/net/201311/13427
相关参考
知识大全 .net WinForm用户控件开发:用户控件复杂属性设置
.netWinForm用户控件开发:用户控件复杂属性设置 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
C#在winform中查找控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ///<su
知识大全 .net WinForm用户控件开发:带按钮的textbox控件
.netWinForm用户控件开发:带按钮的textbox控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
知识大全 .net WinForm用户控件开发:用户控件的基本属性设置
.netWinForm用户控件开发:用户控件的基本属性设置 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
知识大全 .net WinForm用户控件开发:用户控件下拉式属性设置
.netWinForm用户控件开发:用户控件下拉式属性设置 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
知识大全 .net WinForm用户控件开发:用户控件弹出式属性设置
.netWinForm用户控件开发:用户控件弹出式属性设置 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
在C#中跨线程访问Winform控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在程序需要读
知识大全 Winform开发框架之权限管理系统改进的经验总结(2)-用户选择界面的设计
Winform开发框架之权限管理系统改进的经验总结(2)-用户选择界面的设计 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让
ASP.NET项目开发指南:界面控件设计(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &
知识大全 ASP.NET项目开发指南:界面控件设计(2)[2]
ASP.NET项目开发指南:界面控件设计(2)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!