C# 绘制矢量图形

使用C#画矢量图,然后导出到Word、Excel、Powerpoint中,并且能够再次被编辑。以下是解决过程:

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

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

/// <summary>
  
/// 导出为 Emf 或 Wmf 文件
  
/// </summary>
  
/// <param name="filePath">文件路径</param>
  
/// <returns>是否成功</returns>

   private   bool  Export( string  filePath)
  
{
   
try
   
{
    Bitmap bmp 
= new Bitmap(220,220);
    Graphics gs 
= Graphics.FromImage(bmp);
    Metafile mf  
= new Metafile(filePath,gs.GetHdc());

    Graphics g 
= Graphics.FromImage(mf);

    Draw(g);

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

    
return true;
   }

   
catch
   
{
    
return false;
   }

  }

  
/// <summary>
  
/// 绘制图形
  
/// </summary>
  
/// <param name="g">用于绘图的Graphics对象</param>

   private   void  Draw(Graphics g)
  
{
   HatchBrush hb 
= new HatchBrush(HatchStyle.LightUpwardDiagonal, Color.Black, Color.White);

   g.FillEllipse(Brushes.Gray,10f,10f,
200,200);
   g.DrawEllipse(
new Pen(Color.Black,1f),10f,10f,200,200);

   g.FillEllipse(hb,30f,95f,
30,30);
   g.DrawEllipse(
new Pen(Color.Black,1f),30f,95f,30,30);

   g.FillEllipse(hb,160f,95f,
30,30);
   g.DrawEllipse(
new Pen(Color.Black,1f),160f,95f,30,30);

   g.FillEllipse(hb,95f,30f,
30,30);
   g.DrawEllipse(
new Pen(Color.Black,1f),95f,30f,30,30);

   g.FillEllipse(hb,95f,160f,
30,30);
   g.DrawEllipse(
new Pen(Color.Black,1f),95f,160f,30,30);

   g.FillEllipse(Brushes.Blue,60f,60f,
100,100);
   g.DrawEllipse(
new Pen(Color.Black,1f),60f,60f,100,100);

   g.FillEllipse(Brushes.BlanchedAlmond,95f,95f,
30,30);
   g.DrawEllipse(
new Pen(Color.Black,1f),95f,95f,30,30);

   g.DrawRectangle(
new Pen(System.Drawing.Brushes.Blue,0.1f),6,6,208,208);

   g.DrawLine(
new Pen(Color.Black,0.1f),110f,110f,220f,25f);
   g.DrawString(
"剖面图",new Font("宋体",9f),Brushes.Green,220f,20f);
}


 产生的图形如下:

 放大后效果:

 在Word 中编辑图形:


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

画个奥运五环

public  void  Graphics.DrawEllipse(
  Pen pen,
  Rectangle rect
)
 
canvas.DrawEllipse( new  Pen(Color.Blue),  new  Rectangle(0, 0, 10, 10));
canvas.DrawEllipse( new  Pen(Color.Black),  new  Rectangle(11, 0, 10, 10));
canvas.DrawEllipse( new  Pen(Color.Red),  new  Rectangle(22, 0, 10, 10));
canvas.DrawEllipse( new  Pen(Color.Yellow),  new  Rectangle(5, 5, 10, 10));
canvas.DrawEllipse( new  Pen(Color.Green),  new  Rectangle(16, 5, 10, 10));

DoNet画圆

画圆可以用Graphics的DrawEllipse方法,

private void button1_Click(object sender, EventArgs e)

        {

            Graphics g = this.CreateGraphics();

            Pen pen = new Pen(Color.Black, 3);

            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            //奥运五环

            g.DrawEllipse(pen, new Rectangle(30, 30, 50, 50));

            g.DrawEllipse(pen, new Rectangle(70, 30, 50, 50));

            g.DrawEllipse(pen, new Rectangle(110, 30, 50, 50));

            g.DrawEllipse(pen, new Rectangle(50, 60, 50, 50));

            g.DrawEllipse(pen, new Rectangle(90, 60, 50, 50));

            //还是这个

            for (int i = 1; i <= 5; i++)

            {

                g.DrawEllipse(pen, new Rectangle(200 + (5 - i) * 10, 30 + 10 * (5 - i), i * 20, i * 20));

            }

            g.Dispose();

            pen.Dispose();

        }


asp.net C# 画圆画矩形

手动画圆或椭圆

   
   
  1. private Point startPoint;  
  2.     private bool beginDragging;  
  3.  
  4.     public Form1()  
  5.     {  
  6.         InitializeComponent();  
  7.         this.DoubleBuffered = true;     
  8.     }  
  9.  
  10.     private void Form1_MouseMove(object sender, MouseEventArgs e)  
  11.     {  
  12.         if (e.Button == MouseButtons.Left && beginDragging)  
  13.         {  
  14.             circle.Size = new Size(circle.Size.Width + e.X - startPoint.X, circle.Size.Height + e.Y - startPoint.Y);  
  15.             startPoint = new Point(e.X, e.Y);  
  16.         }  
  17.         this.Invalidate();  
  18.     }  
  19.  
  20.     private void Form1_MouseDown(object sender, MouseEventArgs e)  
  21.     {  
  22.         if (e.Button == MouseButtons.Left)  
  23.         {  
  24.             startPoint = e.Location;  
  25.             beginDragging = true;  
  26.             this.Capture = true;  
  27.  
  28.             circle = new Circle();  
  29.             circle.Location = e.Location;  
  30.             Circles.Add(circle);  
  31.  
  32.             this.Cursor = System.Windows.Forms.Cursors.Cross;  
  33.         }  
  34.  
  35.     }  
  36.  
  37.     private void Form1_MouseUp(object sender, MouseEventArgs e)  
  38.     {  
  39.         if (e.Button == MouseButtons.Left && beginDragging)  
  40.         {  
  41.             beginDragging = false;  
  42.             this.Capture = false;  
  43.  
  44.             this.Cursor = System.Windows.Forms.Cursors.Default;  
  45.         }  
  46.         this.Invalidate();  
  47.     }  
  48.  
  49.     private void Form1_Paint(object sender, PaintEventArgs e)  
  50.     {  
  51.         Graphics g = e.Graphics;  
  52.         foreach (Circle each in Circles)  
  53.         {  
  54.             g.DrawEllipse(Pens.Black, new Rectangle(each.Location, each.Size));  
  55.         }  
  56.     }  
  57.     private List<Circle> Circles = new List<Circle>();  
  58.     private Circle circle = new Circle();  
  59.  
  60. public class Circle  
  61. {  
  62.     public int Radii;  
  63.     public Size Size;  
  64.     public Point Location;  
  65. }  

自动画圆

   
   
  1. //方法1  
  2.         private void button1_Click_1(object sender, EventArgs e)  
  3.         {  
  4.             Image im = new Bitmap(this.panel2.Width, this.panel2.Height);  
  5.             Graphics g = Graphics.FromImage(im);  
  6.             GraphicsPath gp = new GraphicsPath();  
  7.             Rectangle rec = new Rectangle(0, 0, 100, 100);  
  8.             gp.AddEllipse(rec);  
  9.             g.DrawEllipse(new Pen(Color.Red), rec);  
  10.             this.panel2.BackgroundImageLayout = ImageLayout.Stretch;  
  11.             this.panel2.BackgroundImage = im;  
  12.         }  
  13. //方法2  
  14.         private void button3_Click(object sender, EventArgs e)  
  15.         {  
  16.             Graphics gra;  
  17.             Brush bush;  
  18.             gra = this.panel3.CreateGraphics();  
  19.             bush = new SolidBrush(Color.Red); //填充的颜色  
  20.             gra.FillEllipse(bush, 0, 0, 100, 100);//画填充椭圆的方法,x坐标、y坐标、宽、高,如果是100,则半径为50    
  21.         } 

自动画矩形

   
   
  1. //方法1  
  2.        private void button2_Click(object sender, EventArgs e)  
  3.        {  
  4.            Image im = new Bitmap(this.panel1.Width,this.panel1.Height);  
  5.            Graphics g = Graphics.FromImage(im);  
  6.            GraphicsPath gp = new GraphicsPath();  
  7.            Rectangle rec = new Rectangle(new Point(0,0),new Size(100,100));  
  8.            gp.AddRectangle(rec);  
  9.            g.DrawRectangle(new Pen(Color.Red), rec);  
  10.            this.panel1.BackgroundImageLayout = ImageLayout.Stretch;  
  11.            this.panel1.BackgroundImage = im;  
  12.        }  
  13. //方法2  
  14.        private void button4_Click(object sender, EventArgs e)  
  15.        {  
  16.            Graphics gra;  
  17.            Brush bush;  
  18.            gra = this.panel4.CreateGraphics();  
  19.            bush = new SolidBrush(Color.Red);  
  20.            gra.DrawRectangle(new Pen(bush,20), 0, 0, 100, 100);  
  21.        } 


分类:  DotNet 专题

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本组件是矢量图组件,现在版本:1.0 免费版本(大家可以随便使用)有如下功能: 包含要素:线、矩、多边、圆、组合图形、文字、图片、椭圆 包含操作:保存、打开、载入数据、放大、缩小、漫游、图库文件 图形操作:选择、修改图形要素、修改图形要素大小、修改、undo、redo、旋转、移动旋转图形、复制、粘贴、剪切、编辑文字、修改线型(端点/中间加图形)、修改图形要素属性、上移、下移等操作。 事件:图形要素的增加、删除、修改前后、选中状态变化都有事件。 付费版本在免费版本的基础上增加: 系统功能:打印、预览、导出图片; 操作功能:圆弧(圆的一段弧线)、曲线。 开发基于:.net framework 2.0!!!!!!!!!!!! 联系方式: qq:3794455 e-mail:[email protected] GraphicSample文件夹: 基于图形控件的样例程序,上述的功能在样例程序中都已经实现,提供全部实现的源码,大家可以参考。 免费版文件夹: SimpleGraphic.dll是图形组件dll包,使用的时候直接引入到工程中,如:工程->references -> add references -> browse -> SimpleGraphic.dll 确定后,在工具箱里就可以找到SampleGraphic组件了,直接拖入到窗体上就可以使用了! WFControlEx.dll 在开发demo(GraphicSimple)时,感觉需要就扩展了些,如果不需要就不用引入了,如果需要也可以引入,没有什么限制! 如果需要其他功能可以继续增加。 详细看《使用说明》和《开发说明》都应该能够看明白的。 组件的保存的文件扩展名我没有加,大家在开发时可以自己添上!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuckyJiang.2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值