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

Форум программистов: 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 ] 


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

Зарегистрированные пользователи: Google [Bot]


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

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