使用C#画矢量图,然后导出到Word、Excel、Powerpoint中,并且能够再次被编辑。以下是解决过程:
首先应该确定在Office文档中可编辑图形使用的格式;学习了相关资料,了解到Office文档主要支持三种矢量图的格式:1、VML图形,2、WMF文件格式,3、EMF文件格式。由于VML图开一般使用HTML语言进行描述,不便于进行操作,因此决定采用WMF和EMF文件格式。
接下来的工作就是要让C#根据提供的数据生成WMF或EMF格式的矢量图形;学习了C#提供的GDI+绘图类库,GDI+可以绘制矢量图形,代码示例如下:
/// 导出为 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();
}
手动画圆或椭圆
- 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);
- }