欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap 谈天说地
   您现在位于: 首页技术专栏ArcGIS应用与开发AO开发 → 正文
将GIS图形复制到Windows剪贴板,粘贴到Word中
07-11-27 00:00:00 作者:watson 出处:http://watsonyin.cnblogs.com/
复制、粘贴功能是一件很简单的事情,但怎样将GIS图形粘贴到word中呢?最简单的思路还是将GIS图形保存为Image形式,发送到剪贴板,再粘贴到Word。但如果Image格式采用栅格的格式,如BMP或JPEG,则粘贴后在Word中拉伸时,效果会受到影响,比较合适的格式是采用WMF或EMF这种矢量的格式。将Visio格式复制到Word中时,可以看到就是这种效果,而且文字还是可以编辑的。好,下面我们就看看怎样实现这个功能。

    第一步当然是将图形复制为一个MetaFile对象:
         public  Metafile GetGeometryMetafile(ISymbol pSymbol, IGeometry pGeometry)
        
{
            
// 先获取一个IDisplayTransformation对象
            IDisplayTransformation pDisTrans  =   new  DisplayTransformationClass(); 
            IEnvelope pEnv 
=  pGeometry.Envelope;
            Rectangle rect 
=   new  Rectangle( 0 0 500 500 ); 
 
            tagRECT r;
            r.left 
=  rect.Left;
            r.right 
=  rect.Right;
            r.bottom 
=  rect.Bottom;
            r.top 
=  rect.Top;

            pDisTrans.set_DeviceFrame(
ref  r);
            pDisTrans.Bounds 
=  pEnv;

            pDisTrans.Resolution 
=   72 ;

            pDisTrans.ReferenceScale 
=   1.0 ;
            pDisTrans.ScaleRatio 
=   1 ;

            
// 创建WMF
            MemoryStream ms  =   new  MemoryStream();
            Graphics g 
=  CreateGraphics();
            IntPtr hdc 
=  g.GetHdc();
            Metafile mf 
=   new  Metafile(ms, hdc,  new  Rectangle( 0 , 0 , 500 , 500 ),MetafileFrameUnit.Pixel, EmfType.EmfPlusDual);
            g.ReleaseHdc(hdc);
            g.Dispose();
            g 
=  Graphics.FromImage(mf); 
        
            g.FillRectangle(
new  SolidBrush(Color.White),  new  Rectangle( 0 0 500 500 ));

            pSymbol.SetupDC((
int )g.GetHdc(), pDisTrans);
            pSymbol.Draw(pGeometry);            
            pSymbol.ResetDC();
            g.ReleaseHdc();

            g.DrawString(
" by watson " this .Font,  new  SolidBrush(Color.Blue),  new  PointF( 20 20 ));

            g.Save();
            g.Dispose();

            
return  mf;
        }


第二步:发送到剪贴板:

IDataObject data  =   new  DataObject();
                data.SetData(DataFormats.MetafilePict, mf);
                Clipboard.SetDataObject(data, 
true );

测试 .... 什么,不成功??
估计是.net不支持将metafile格式复制到剪贴板吧。
于是,用于搜索引擎,搜索一翻,在某国外论坛找到解决方案:
  public   class  ClipboardMetafileHelper
    
{
        [DllImport(
" user32.dll " )]
        
static   extern   bool  OpenClipboard(IntPtr hWndNewOwner);
        [DllImport(
" user32.dll " )]
        
static   extern   bool  EmptyClipboard();
        [DllImport(
" user32.dll " )]
        
static   extern  IntPtr SetClipboardData( uint  uFormat, IntPtr hMem);
        [DllImport(
" user32.dll " )]
        
static   extern   bool  CloseClipboard();
        [DllImport(
" gdi32.dll " )]
        
static   extern  IntPtr CopyEnhMetaFile(IntPtr hemfSrc, IntPtr hNULL);
        [DllImport(
" gdi32.dll " )]
        
static   extern   bool  DeleteEnhMetaFile(IntPtr hemf);

        
//  Metafile mf is set to an invalid state inside this function
         static   public   bool  PutEnhMetafileOnClipboard(IntPtr hWnd, Metafile mf)
        
{
            
bool  bResult  =   false ;
            IntPtr hEMF, hEMF2;
            hEMF 
=  mf.GetHenhmetafile();  //  invalidates mf
             if  ( ! hEMF.Equals( new  IntPtr( 0 )))
            
{
                hEMF2 
=  CopyEnhMetaFile(hEMF,  new  IntPtr( 0 ));
                
if  ( ! hEMF2.Equals( new  IntPtr( 0 )))
                
{
                    
if  (OpenClipboard(hWnd))
                    
{
                        
if  (EmptyClipboard())
                        
{
                            IntPtr hRes 
=  SetClipboardData( 14   /* CF_ENHMETAFILE */ , hEMF2);
                            bResult 
=  hRes.Equals(hEMF2);
                            CloseClipboard();
                        }

                    }

                }

                DeleteEnhMetaFile(hEMF);
            }

            
return  bResult;
        }

    }

9 7 3 1 2 4 8 :

(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  

    关于我们 友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.

                   滇ICP备05006901号