知识大全 如何导出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中查找控件

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控件

在C#中跨线程访问Winform控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在程序需要读

知识大全 Winform开发框架之权限管理系统改进的经验总结(2)-用户选择界面的设计

Winform开发框架之权限管理系统改进的经验总结(2)-用户选择界面的设计  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让

知识大全 ASP.NET项目开发指南:界面控件设计(1)

ASP.NET项目开发指南:界面控件设计(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &

知识大全 ASP.NET项目开发指南:界面控件设计(2)[2]

ASP.NET项目开发指南:界面控件设计(2)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!