Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КР (блок-схемы).doc
Скачиваний:
7
Добавлен:
10.05.2015
Размер:
337.92 Кб
Скачать

4. Исходный код программы:

4.1. Исходный код класса Scheme.cs:

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace SchemesGenerator

{

public enum BlockType { Process, Subprocess, Solution, Input, Output, HighLoopBorder, LowLoopBorder, Terminator };

public class Block

{

public BlockType Type { get; set; }

public string Text { get; set; }

public Point Start { get; set; }

public int Number { get; set; }

}

public class Scheme

{

public List<Block> Blocks;

public int Count { get; set; }

public Scheme()

{

Count = 0;

Blocks = new List<Block>();

}

public void AddBlock(ref Block CurBlock)

{

Block b = CurBlock;

if (Count > 0) { b.Number = Count; } else { b.Number = Count + 1; }

Blocks.Add(b);

Count++;

}

public void DeleteLast()

{

if (Count < 1) { return; }

Count--;

Blocks.RemoveAt(Count);

}

public void DeleteAll()

{

if (Count<1) { return; }

Blocks.RemoveRange(0,Count-1);

Count = 0;

}

}

}

4.2. Исходный код класса DrawScheme.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Drawing;

namespace SchemesGenerator

{

public class DrawScheme : Scheme

{

private Graphics Canvas { get; set; }

const int DISTANCE = 100;

const int WIDTH = 125;

const int HEIGHT = 75;

public void DrawTerminator(Block OpBlock)

{

Pen p = new Pen(System.Drawing.Color.White);

SolidBrush b = new SolidBrush(System.Drawing.Color.White);

Font f = new Font ("Arial",12);

p.Width = 2;

Canvas.DrawEllipse(p, OpBlock.Start.X , OpBlock.Start.Y, HEIGHT * 2 / 3, HEIGHT * 2 / 3);

Canvas.FillEllipse(b, OpBlock.Start.X , OpBlock.Start.Y, HEIGHT*2/3, HEIGHT*2/3);

Canvas.DrawEllipse(p, OpBlock.Start.X + WIDTH*3/5, OpBlock.Start.Y, HEIGHT*2/3, HEIGHT*2/3);

Canvas.FillEllipse(b, OpBlock.Start.X + WIDTH*3/5, OpBlock.Start.Y, HEIGHT*2/3, HEIGHT*2/3);

Canvas.DrawRectangle(p, OpBlock.Start.X + HEIGHT/3, OpBlock.Start.Y, WIDTH*3/5, HEIGHT*2/3);

Canvas.FillRectangle(b, OpBlock.Start.X + HEIGHT / 3, OpBlock.Start.Y, WIDTH * 3 / 5, HEIGHT * 2 / 3);

b.Color = System.Drawing.Color.Black;

Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X, OpBlock.Start.Y + 10);

}

public void DrawProcess(Block OpBlock)

{

Pen p = new Pen(System.Drawing.Color.White);

SolidBrush b = new SolidBrush(System.Drawing.Color.White);

Font f = new Font("Arial", 12);

Canvas.DrawRectangle(p,OpBlock.Start.X, OpBlock.Start.Y, WIDTH, HEIGHT);

Canvas.FillRectangle(b, OpBlock.Start.X, OpBlock.Start.Y, WIDTH, HEIGHT);

b.Color = System.Drawing.Color.Black;

Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X+30, OpBlock.Start.Y + 30);

Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);

}

public void DrawSubprocess(Block OpBlock)

{

Pen p = new Pen(System.Drawing.Color.White);

SolidBrush b = new SolidBrush(System.Drawing.Color.White);

Font f = new Font("Arial", 12);

Canvas.DrawRectangle(p, OpBlock.Start.X, OpBlock.Start.Y, WIDTH, HEIGHT);

Canvas.FillRectangle(b, OpBlock.Start.X, OpBlock.Start.Y, WIDTH, HEIGHT);

b.Color = System.Drawing.Color.Black;

p.Color = b.Color;

Canvas.DrawLine(p, OpBlock.Start.X + 15, OpBlock.Start.Y, OpBlock.Start.X + 15, OpBlock.Start.Y + HEIGHT);

Canvas.DrawLine(p, OpBlock.Start.X + WIDTH - 15, OpBlock.Start.Y, OpBlock.Start.X + WIDTH - 15, OpBlock.Start.Y + HEIGHT);

Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X + 30, OpBlock.Start.Y + 30);

Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);

}

public void DrawSolution(Block OpBlock)

{

Pen p = new Pen(System.Drawing.Color.White);

SolidBrush b = new SolidBrush(System.Drawing.Color.White);

Font f = new Font("Arial", 12);

Point[] Points = new Point[5];

Points[0].X = OpBlock.Start.X + WIDTH / 2;

Points[0].Y = OpBlock.Start.Y;

Points[1].X = OpBlock.Start.X + WIDTH;

Points[1].Y = OpBlock.Start.Y + HEIGHT / 2;

Points[2].X = Points[0].X;

Points[2].Y = OpBlock.Start.Y + HEIGHT;

Points[3].X = OpBlock.Start.X;

Points[3].Y = Points[1].Y;

Points[4] = Points[0];

Canvas.DrawPolygon(p, Points);

Canvas.FillPolygon(b, Points);

b.Color = System.Drawing.Color.Black;

Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X + 28, OpBlock.Start.Y + 28);

Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);

}

public void DrawHighLoopBorder(Block OpBlock)

{

Pen p = new Pen(System.Drawing.Color.White);

SolidBrush b = new SolidBrush(System.Drawing.Color.White);

Font f = new Font("Arial", 12);

Point[] Points = new Point[7];

const int ANGLE = 15;

Points[0].X = OpBlock.Start.X + ANGLE;

Points[0].Y = OpBlock.Start.Y;

Points[1].X = OpBlock.Start.X + WIDTH - ANGLE;

Points[1].Y = OpBlock.Start.Y;

Points[2].X = OpBlock.Start.X + WIDTH;

Points[2].Y = OpBlock.Start.Y + ANGLE;

Points[3].X = OpBlock.Start.X + WIDTH;

Points[3].Y = OpBlock.Start.Y + HEIGHT;

Points[4].X = OpBlock.Start.X;

Points[4].Y = OpBlock.Start.Y + HEIGHT;

Points[5].X = OpBlock.Start.X;

Points[5].Y = OpBlock.Start.Y + ANGLE;

Points[6] = Points[0];

Canvas.DrawPolygon(p, Points);

Canvas.FillPolygon(b, Points);

b.Color = System.Drawing.Color.Black;

Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X + 28, OpBlock.Start.Y + 28);

Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);

}

public void DrawLowLoopBorder(Block OpBlock)

{

Pen p = new Pen(System.Drawing.Color.White);

SolidBrush b = new SolidBrush(System.Drawing.Color.White);

Font f = new Font("Arial", 12);

Point[] Points = new Point[7];

const int ANGLE = 15;

Points[0].X = OpBlock.Start.X;

Points[0].Y = OpBlock.Start.Y;

Points[1].X = OpBlock.Start.X + WIDTH;

Points[1].Y = OpBlock.Start.Y;

Points[2].X = OpBlock.Start.X + WIDTH;

Points[2].Y = OpBlock.Start.Y + HEIGHT - ANGLE;

Points[3].X = OpBlock.Start.X + WIDTH - ANGLE;

Points[3].Y = OpBlock.Start.Y + HEIGHT;

Points[4].X = OpBlock.Start.X + ANGLE;

Points[4].Y = OpBlock.Start.Y + HEIGHT;

Points[5].X = OpBlock.Start.X;

Points[5].Y = OpBlock.Start.Y + HEIGHT - ANGLE;

Points[6] = Points[0];

Canvas.DrawPolygon(p, Points);

Canvas.FillPolygon(b, Points);

b.Color = System.Drawing.Color.Black;

Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X + 28, OpBlock.Start.Y + 28);

Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);

}

public void DrawInput(Block OpBlock)

{

Pen p = new Pen(System.Drawing.Color.White);

SolidBrush b = new SolidBrush(System.Drawing.Color.White);

Font f = new Font("Arial", 12);

Point[] Points = new Point[5];

Points[0].X = OpBlock.Start.X;

Points[0].Y = OpBlock.Start.Y + HEIGHT/3;

Points[1].X = OpBlock.Start.X + WIDTH;

Points[1].Y = OpBlock.Start.Y;

Points[2].X = OpBlock.Start.X + WIDTH;

Points[2].Y = OpBlock.Start.Y + HEIGHT;

Points[3].X = OpBlock.Start.X;

Points[3].Y = OpBlock.Start.Y + HEIGHT;

Points[4] = Points[0];

Canvas.DrawPolygon(p, Points);

Canvas.FillPolygon(b, Points);

b.Color = System.Drawing.Color.Black;

Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X + 30, OpBlock.Start.Y + 28);

Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);

}

public void DrawOutput(Block OpBlock)

{

Pen p = new Pen(System.Drawing.Color.White);

SolidBrush b = new SolidBrush(System.Drawing.Color.White);

Font f = new Font("Arial", 12);

Canvas.DrawEllipse(p, OpBlock.Start.X, OpBlock.Start.Y, WIDTH, HEIGHT);

Canvas.FillEllipse(b, OpBlock.Start.X, OpBlock.Start.Y, WIDTH, HEIGHT);

b.Color = System.Drawing.Color.Black;

Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X + 30, OpBlock.Start.Y + 28);

Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);

}

public void DrawLine(Block SourceBlock, Block AimBlock)

{

Pen p = new Pen(System.Drawing.Color.Black);

p.Width = 2;

p.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;

int sy = SourceBlock.Start.Y + HEIGHT, ay = AimBlock.Start.Y;

if (SourceBlock.Type == BlockType.Terminator) { sy -= 25; }

if (AimBlock.Type == BlockType.Input) { ay += 15; }

Canvas.DrawLine(p, SourceBlock.Start.X + WIDTH / 2, sy, AimBlock.Start.X + WIDTH / 2, ay);

}

public DrawScheme(Graphics Graphics)

{

UpdateGraphics(Graphics);

}

public void DrawBlock(Block OpBlock)

{

switch (OpBlock.Type)

{

case BlockType.Process : { DrawProcess(OpBlock); break; }

case BlockType.Subprocess : { DrawSubprocess(OpBlock); break; }

case BlockType.Solution : { DrawSolution(OpBlock); break; }

case BlockType.Terminator : { DrawTerminator(OpBlock); break; }

case BlockType.HighLoopBorder : { DrawHighLoopBorder(OpBlock); break; }

case BlockType.LowLoopBorder : { DrawLowLoopBorder(OpBlock); break; }

case BlockType.Input : { DrawInput(OpBlock); break; }

case BlockType.Output : { DrawOutput(OpBlock); break; }

}

}

public void Draw()

{

Point t = new Point();

int y = 0;

for (int i = 0; i < Count; i++)

{

t.Y = DISTANCE * y;

t.X = 50;

y++;

Blocks[i].Start = t;

DrawBlock(Blocks[i]);

}

if (Count <= 1) { return; }

for (int j = 1; j < Count; j++)

{

DrawLine(Blocks[j-1], Blocks[j]);

}

}

public void UpdateGraphics(Graphics g)

{

Canvas = g;

}

}

}

4.3. Исходный код класса формы Form1.cs:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace SchemesGenerator

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

Graphics g;

Color c;

Form2 M;

public DrawScheme b;

private int h;

private void button2_Click(object sender, EventArgs e)

{

int s = pictureBox1.ClientSize.Width;

Size client = new Size();

Block bl = new Block();

h += 100;

M.ShowDialog();

Object val = Convert.ChangeType(M.Tag, typeof(Block));

bl = (Block)val;

b.AddBlock(ref bl);

client.Height = h;

client.Width = s;

pictureBox1.ClientSize = client;

g = pictureBox1.CreateGraphics();

b.UpdateGraphics(g);

b.Draw();

}

private void button1_Click(object sender, EventArgs e)

{

b.DeleteLast();

g.Clear(c);

b.Draw();

}

private void Form1_Shown(object sender, EventArgs e)

{

b = new DrawScheme(g);

c = new Color();

c = Form1.DefaultBackColor;

M = new Form2();

panel1.Controls.Add(pictureBox1);

h = pictureBox1.ClientSize.Height;

}

private void button3_Click(object sender, EventArgs e)

{

b.DeleteAll();

g.Clear(c);

}

private void pictureBox1_Paint(object sender, PaintEventArgs e)

{

b.Draw();

}

}

}

4.4. Исходный код класса формы Form2.cs:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace SchemesGenerator

{

public partial class Form2 : Form

{

public Form2()

{

InitializeComponent();

}

public int Item;

private void Form2_Shown(object sender, EventArgs e)

{

groupBox1.Controls.Add(radioButton1);

groupBox1.Controls.Add(radioButton2);

groupBox1.Controls.Add(radioButton3);

groupBox1.Controls.Add(radioButton4);

groupBox1.Controls.Add(radioButton5);

groupBox1.Controls.Add(radioButton6);

groupBox1.Controls.Add(radioButton7);

groupBox1.Controls.Add(radioButton8);

}

void radioButton_CheckedChanged(object sender, EventArgs e)

{

RadioButton rb = sender as RadioButton;

var t = typeof(int);

if (rb.Checked)

{

Object val = Convert.ChangeType(rb.Tag, t);

Item = Convert.ToInt32(val);

}

}

public BlockType GetBlockType(int Choice)

{

switch (Choice) {

case 0: { return BlockType.Terminator; }

case 1: { return BlockType.Process; }

case 2: { return BlockType.Subprocess; }

case 3: { return BlockType.Solution; }

case 4: { return BlockType.HighLoopBorder; }

case 5: { return BlockType.LowLoopBorder; }

case 6: { return BlockType.Input; }

case 7: { return BlockType.Output; }

default: return BlockType.Process;

}

}

private void button1_Click(object sender, EventArgs e)

{

Block t = new Block();

t.Text = textBox1.Text;

t.Type = GetBlockType(Item);

this.Tag = t;

this.Close();

}

}

}

5. Результаты работы:

Рисунок 6 – Общий вид главного окна приложения

Рисунок 7 – Общий вид окна выбора параметров блока

Рисунок 8 – Демонстрация простейшей схемы, созданной приложением

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]