C# 绘制矢量图形 [原创]

    近来参与了一个项目,软件主要的功能就是使用C#画矢量图,然后导出到Word、Excel、Powerpoint中,并且能够再次被编辑。以下是我们的解决过程:

    首先应该确定在Office文档中可编辑图形使用的格式;学习了相关资料,了解到Office文档主要支持三种矢量图的格式:1、VML图形,2、WMF文件格式,3、EMF文件格式。由于VML图开一般使用HTML语言进行描述,不便于进行操作,因此决定采用WMF和EMF文件格式。

    接下来的工作就是要让C#根据提供的数据生成WMF或EMF格式的矢量图形;学习了C#提供的GDI+绘图类库,GDI+可以绘制矢量图形,代码示例如下:
  

ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
InBlock.gif  
/// 导出为 Emf 或 Wmf 文件
InBlock.gif  
/// </summary>
InBlock.gif  
/// <param name="filePath">文件路径</param>
ExpandedBlockEnd.gif  
/// <returns>是否成功</returns>

None.gif    private   bool  Export( string  filePath)
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
InBlock.gif   
try
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    Bitmap bmp 
= new Bitmap(220,220);
InBlock.gif    Graphics gs 
= Graphics.FromImage(bmp);
InBlock.gif    Metafile mf  
= new Metafile(filePath,gs.GetHdc());
InBlock.gif
InBlock.gif    Graphics g 
= Graphics.FromImage(mf);
InBlock.gif
InBlock.gif    Draw(g);
InBlock.gif
InBlock.gif    g.Save();
InBlock.gif    g.Dispose();
InBlock.gif    mf.Dispose();
InBlock.gif
InBlock.gif    
return true;
ExpandedSubBlockEnd.gif   }

InBlock.gif   
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    
return false;
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif  }

ExpandedBlockStart.gifContractedBlock.gif  
/**/ /// <summary>
InBlock.gif  
/// 绘制图形
InBlock.gif  
/// </summary>
ExpandedBlockEnd.gif  
/// <param name="g">用于绘图的Graphics对象</param>

None.gif    private   void  Draw(Graphics g)
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
InBlock.gif   HatchBrush hb 
= new HatchBrush(HatchStyle.LightUpwardDiagonal, Color.Black, Color.White);
InBlock.gif
InBlock.gif   g.FillEllipse(Brushes.Gray,10f,10f,
200,200);
InBlock.gif   g.DrawEllipse(
new Pen(Color.Black,1f),10f,10f,200,200);
InBlock.gif
InBlock.gif   g.FillEllipse(hb,30f,95f,
30,30);
InBlock.gif   g.DrawEllipse(
new Pen(Color.Black,1f),30f,95f,30,30);
InBlock.gif
InBlock.gif   g.FillEllipse(hb,160f,95f,
30,30);
InBlock.gif   g.DrawEllipse(
new Pen(Color.Black,1f),160f,95f,30,30);
InBlock.gif
InBlock.gif   g.FillEllipse(hb,95f,30f,
30,30);
InBlock.gif   g.DrawEllipse(
new Pen(Color.Black,1f),95f,30f,30,30);
InBlock.gif
InBlock.gif   g.FillEllipse(hb,95f,160f,
30,30);
InBlock.gif   g.DrawEllipse(
new Pen(Color.Black,1f),95f,160f,30,30);
InBlock.gif
InBlock.gif   g.FillEllipse(Brushes.Blue,60f,60f,
100,100);
InBlock.gif   g.DrawEllipse(
new Pen(Color.Black,1f),60f,60f,100,100);
InBlock.gif
InBlock.gif   g.FillEllipse(Brushes.BlanchedAlmond,95f,95f,
30,30);
InBlock.gif   g.DrawEllipse(
new Pen(Color.Black,1f),95f,95f,30,30);
InBlock.gif
InBlock.gif   g.DrawRectangle(
new Pen(System.Drawing.Brushes.Blue,0.1f),6,6,208,208);
InBlock.gif
InBlock.gif   g.DrawLine(
new Pen(Color.Black,0.1f),110f,110f,220f,25f);
InBlock.gif   g.DrawString(
"剖面图",new Font("宋体",9f),Brushes.Green,220f,20f);
ExpandedBlockEnd.gif}

None.gif
None.gif

 产生的图形如下:
Export.JPG

 放大后效果:
Big_1.JPG

 在Word 中编辑图形:
Word.JPG

至此,实现了该软件的技术要求功能。

转载于:https://www.cnblogs.com/Infinity/archive/2006/08/10/473250.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值