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
    评论
21世纪什么最重要?通用!想让你的图形控件和主流软件共享同一种编辑结果吗,那就选择我吧!国内唯一全面基于国际矢量图标准SVG的专业开发控件,提供全面的矢量编辑能力,能适应组态软件和其他图形软件开发需要。能够和其他主流的编辑软件如illustrator,Visio等共享最终编辑结果。使用VectorControl.Net,您可以:> 基本绘制,支持圆、椭圆、矩、正方、直线、多边、折线的绘制> 图像和文本构造,支持导入图像和文本构造> 扩展绘制,支持星状和扇的构造> 钢笔工具绘制,支持任意状的曲线构造(贝赛尔曲线)> 二维变换,支持缩放、扭曲、平移和旋转等二维变换,并可以启用或禁用这些操作。> 图形的成组和解组> 图形的层次调整> 支持多个图形之间的对齐> 支持多个图形之间的分布功能> 调整多个图形的尺寸以达到相同高度或宽度> 网格、参考线、标尺等完整视图环境并支持吸附。> 支持外部自定义状和图元文件,给与用户自由扩展功能的能力,并能将当前绘图内容导出为状和图元> 支持连接线,可以在对象之间保持联系> 无限制的撤销/重作> 支持SVG文件的导入> Bmp,Jpg,Gif,Tiff等多种栅格图像格式的导出> SVG文件代码预览> VectorControl.Net还提供了许多Windows界面开发组件,包括弹出菜单时容器,状和组件库选择器等> 打印支持> 两套完整的示例程序以及源代码(C#和VB.Net),全面全面展现了如何利用VectorControl.Net控件实现简单的矢量应用(不需要任何手工编码实现SVG浏览器)和利用VectorControl实现一个完整的矢量编辑环境(具备所有矢量图编辑功能)的能力,您甚至可以直接将我们提供的示例程序用作您默认的矢量图的编辑器。
仿Autocad软件C是指开发一个类似于Autocad的绘图软件,使用C语言进行编程实现。 C语言是一种高效、灵活且广泛应用于系统编程的编程语言。借助C语言的底层编程能力,我们可以对硬件进行更直接的控制,从而实现对图形界面的操作。 要开发一个仿Autocad软件C,首先需要定义并实现一些基础功能,如绘图操作、图形编辑、图层管理、坐标系转换等。在绘图操作方面,我们可以使用C语言中的图形库,如OpenGL、DirectX等,来绘制各种图形,如点、线段、多边等。图形编辑功能可以包括图形的移动、缩放、旋转等操作。图层管理可以实现对不同图形的分层管理,以便于操作者进行图形选择和编辑。坐标系转换可以实现不同坐标系之间的转换,以适应不同的数据输入和输出需求。 除了基础功能外,仿Autocad软件C还可以增加一些高级功能,例如:实现三维绘图、支持文件导出和导入、提供自动绘图功能、增加协同设计等。通过这些高级功能,我们可以为用户提供更多的选择和便利,满足不同用户的绘图需求。 在开发仿Autocad软件C时,需要充分了解Autocad软件的特点和功能,理解它的设计思路和实现方式,并且进行合理的调试和测试,确保软件的稳定性和可靠性。另外,为了提高软件的表现和用户体验,还需要注重界面设计、交互设计和性能优化等方面的工作。 总之,仿Autocad软件C是一个复杂的工程,需要充分的计划和准备。通过合理的设计和编程实现,可以开发出一款功能强大、易用性好的绘图软件,满足用户对于绘图的各种需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LuckyJiang.2021

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

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

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

打赏作者

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

抵扣说明:

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

余额充值