您的位置:首页 > 编程语言 > C#

C# 绘制矢量图形

2012-11-17 14:45 966 查看
使用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 中编辑图形:



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

画个奥运五环

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# 画圆画矩形

手动画圆或椭圆
private Point startPoint;
private bool beginDragging;

public Form1()
{
InitializeComponent();
this.DoubleBuffered = true;
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && beginDragging)
{
circle.Size = new Size(circle.Size.Width + e.X - startPoint.X, circle.Size.Height + e.Y - startPoint.Y);
startPoint = new Point(e.X, e.Y);
}
this.Invalidate();
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
startPoint = e.Location;
beginDragging = true;
this.Capture = true;

circle = new Circle();
circle.Location = e.Location;
Circles.Add(circle);

this.Cursor = System.Windows.Forms.Cursors.Cross;
}

}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && beginDragging)
{
beginDragging = false;
this.Capture = false;

this.Cursor = System.Windows.Forms.Cursors.Default;
}
this.Invalidate();
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
foreach (Circle each in Circles)
{
g.DrawEllipse(Pens.Black, new Rectangle(each.Location, each.Size));
}
}
private List<Circle> Circles = new List<Circle>();
private Circle circle = new Circle();

public class Circle
{
public int Radii;
public Size Size;
public Point Location;
}


自动画圆
//方法1
private void button1_Click_1(object sender, EventArgs e)
{
Image im = new Bitmap(this.panel2.Width, this.panel2.Height);
Graphics g = Graphics.FromImage(im);
GraphicsPath gp = new GraphicsPath();
Rectangle rec = new Rectangle(0, 0, 100, 100);
gp.AddEllipse(rec);
g.DrawEllipse(new Pen(Color.Red), rec);
this.panel2.BackgroundImageLayout = ImageLayout.Stretch;
this.panel2.BackgroundImage = im;
}
//方法2
private void button3_Click(object sender, EventArgs e)
{
Graphics gra;
Brush bush;
gra = this.panel3.CreateGraphics();
bush = new SolidBrush(Color.Red); //填充的颜色
gra.FillEllipse(bush, 0, 0, 100, 100);//画填充椭圆的方法,x坐标、y坐标、宽、高,如果是100,则半径为50
}


自动画矩形
//方法1
private void button2_Click(object sender, EventArgs e)
{
Image im = new Bitmap(this.panel1.Width,this.panel1.Height);
Graphics g = Graphics.FromImage(im);
GraphicsPath gp = new GraphicsPath();
Rectangle rec = new Rectangle(new Point(0,0),new Size(100,100));
gp.AddRectangle(rec);
g.DrawRectangle(new Pen(Color.Red), rec);
this.panel1.BackgroundImageLayout = ImageLayout.Stretch;
this.panel1.BackgroundImage = im;
}
//方法2
private void button4_Click(object sender, EventArgs e)
{
Graphics gra;
Brush bush;
gra = this.panel4.CreateGraphics();
bush = new SolidBrush(Color.Red);
gra.DrawRectangle(new Pen(bush,20), 0, 0, 100, 100);
}


分类: DotNet
专题

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: