→ Для вступления в общество новичков и профессионалов программирования, пожалуйста нажмите здесь ...

Форум программистов: C++, Basic, Delphi, Pascal, JavaScript
Логин: Пароль:
Запомнить?  
@Mail.ru



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Нужно разобраться в коде программы на С# 
Автор Сообщение
Начинающий

Регистрация: 24.04.2012
Сообщения: 1
Языки:
Специальность:

Репутация: 0 [ ? ]
Сообщение Нужно разобраться в коде программы на С#
Есть программа, помогите разобраться хотяб по блокам что есть что, ну или какой блок что выполняет. буду очень благодарен.

using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System;

namespace WindowsFormsApplication87
{
public partial class Form1 : Form
{
private Figure page;

public Form1()
{
this.WindowState = FormWindowState.Maximized;
this.DoubleBuffered = true;
this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);

page = new Figure();
page.Location = new PointF(10, 10);
page.ScaleX = 200;
page.ScaleY = 200;

Figure r1 = new Figure();
r1.Parent = page;
r1.Brush = Brushes.Red;
r1.ScaleX = 0.1f;
r1.ScaleY = 0.1f;
r1.Location = new PointF(0.3f, 0.2f);

Figure r2 = new Figure();
r2.Parent = page;
r2.Brush = Brushes.Blue;
r2.ScaleX = 0.1f;
r2.ScaleY = 0.1f;
r2.Location = new PointF(0.6f, 0.6f);

Figure r3 = new Figure();
r3.Parent = r2;
r3.Brush = Brushes.Yellow;
r3.ScaleX = 0.5f;
r3.ScaleY = 0.5f;
r3.Location = new PointF(0.1f, 0.1f);

}

protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
page.Draw(e.Graphics, new Matrix());
}

protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (page.GetFigureByPoint(e.Location, new Matrix()) != null)
Cursor = Cursors.SizeAll;
else
Cursor = Cursors.Default;

if (targetFigure != null)
{
var d = new PointF(e.Location.X - mouseStartPos.X, e.Location.Y - mouseStartPos.Y);
if (e.Button == System.Windows.Forms.MouseButtons.Left)
targetFigure.Offset(d, new Matrix());
if (e.Button == System.Windows.Forms.MouseButtons.Right)
targetFigure.Rotate(d.Y*5);
mouseStartPos = e.Location;
Invalidate();
}
}

protected override void OnMouseWheel(MouseEventArgs e)
{
targetFigure = page.GetFigureByPoint(e.Location, new Matrix());
if (targetFigure != null)
{
if (e.Delta>0)
targetFigure.Scale(new PointF(1.1f, 1.1f), new Matrix());
else
targetFigure.Scale(new PointF(0.9f, 0.9f), new Matrix());
Invalidate();
}
}

Figure targetFigure;
Point mouseStartPos;
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
targetFigure = page.GetFigureByPoint(e.Location, new Matrix());
mouseStartPos = e.Location;
}

protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
targetFigure = null;
}

}

class Figure
{
public PointF Location { get; set; }
public float ScaleX { get; set; }
public float ScaleY { get; set; }
float angle;
public float Angle { get { return angle; } set { Rotate(value - angle); } }
public Pen Pen { get; set; }
public Brush Brush { get; set; }
protected GraphicsPath path = new GraphicsPath();

Figure parent;
public Figure Parent {
get { return parent; }
set {
parent = value;
parent.childs.Add(this);
}
}

List<Figure> childs = new List<Figure>();

public void Rotate(float delta)
{
Matrix M = new Matrix();
M.Rotate(angle);
PointF[] p = new PointF[] { new PointF(-ScaleX / 2, -ScaleY / 2) };
PointF[] p2 = new PointF[] { new PointF(-ScaleX / 2, -ScaleY / 2) };
M.TransformPoints(p);
M.Rotate(delta);
M.TransformPoints(p2);

Location = new PointF(Location.X + p2[0].X - p[0].X, Location.Y + p2[0].Y - p[0].Y);
angle += delta;
}

public IEnumerable<Figure> Childs {
get { return childs; }
}

public Figure()
{
Pen = Pens.Black;
Brush = Brushes.White;
path.AddRectangle(new RectangleF(0f, 0f, 1f, 1f));
}

public void Draw(Graphics g, Matrix matrix)
{
var m = BuildMatrix(matrix);

var path = (GraphicsPath)this.path.Clone();
path.Transform(m);

g.FillPath(Brush, path);
g.DrawPath(Pen, path);


foreach (var child in Childs)
child.Draw(g, m);
}

public Figure GetFigureByPoint(PointF p, Matrix matrix)
{
var m = BuildMatrix(matrix);

foreach(var child in Childs)
{
var f = child.GetFigureByPoint(p, m);
if(f!=null)
return f;
}

var path = (GraphicsPath)this.path.Clone();
path.Transform(m);
if (path.IsVisible(p))
return this;
return null;
}

public Matrix BuildMatrix(Matrix matrix)
{
var m = (Matrix)matrix.Clone();
m.Translate(Location.X, Location.Y);
m.Scale(ScaleX, ScaleY);
m.Rotate(angle);

return m;
}

public Matrix BuildGlobalMatrix(Matrix matrix)
{
return BuildMatrix(parent == null?matrix:parent.BuildGlobalMatrix(matrix));
}

public void Offset(PointF point, Matrix matrix)
{
var m = parent==null?matrix:parent.BuildGlobalMatrix(matrix);
m = new Matrix(m.Elements[0], m.Elements[1], m.Elements[2], m.Elements[3], 0, 0);
m.Invert();
PointF[] points = new PointF[]{point};
m.TransformPoints(points);
point = points[0];
//
Location = new PointF(Location.X + point.X, Location.Y + point.Y);
}

public void Scale(PointF point, Matrix matrix)
{
ScaleX = ScaleX * point.X;
ScaleY = ScaleY * point.Y;
}
}
}


24.04.2012 23:15
Профиль Отправить email
Начинающий

Регистрация: 07.05.2012
Сообщения: 3
Языки:
Специальность:

Репутация: 0 [ ? ]
Сообщение Re: Нужно разобраться в коде программы на С#
你好!


07.05.2012 19:34
Профиль Отправить email
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 


Кто сейчас на конференции

Зарегистрированные пользователи: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
© 2013 «Форум программистов Украины»