Всем привет! Я пишу редактор для изображений, для своей программы, ну из неё редактор будет получать изображения. И вот мне хотелось бы знать мнение, кого нибудь реально хорошо разбирающегося в WPF и программировании в целом. Суть вопроса в том, мне хотелось бы понять у меня вообще правильный подход к тому, что мне нужно? Мне нужно сделать фигуры как в Word'e. Начал с линии, которую потом можно будет редактировать и т.д. Зачем это надо? Это надо, чтобы что-то например рисовать, что-то подчеркнуть, ну линия это только начало, далее думаю и она получит развитие. Например нарисовал, что надо стрелочки поставил (например нужно, когда кому-то, что-то объясняешь, чтобы показать на картинке), растрировал, сохранил, отправил на хостинг, выложил на форуме. Этот класс можно добавить к себе и посмотреть, на эту самую линию. Вообще правильный поход, как вы думаете? Я просто подобного не делал раньше. | Код | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Shapes; using System.Windows; using System.Windows.Controls; using System.Windows.Input;
namespace YourAssistant.ObjectsFigures { public class ExtendedLine { public Line line; /// <summary> /// ссылка на грид используемый в качестве контейнера /// </summary> Grid gridContainer; //ссылка на грид используемый в качестве контейнера Point mouseDownPos = new Point(); Point mouseMovePos = new Point();
//координаты для перетаскивания линии целиком, за линию Point mouseShiftPoint = new Point(); Point LinePointA = new Point(); //координата точки А на линии Point LinePointB = new Point(); //координата точки Б на линии //=====================================================
Ellipse ellipseStartLine; //стартовая позиция линии, то есть точка А Ellipse ellipseEndLine; //конечная позиция линии, то есть точка Б
/// <summary> /// Расширенная линия /// </summary> /// <param name="grid">Grid к которому будет привязанна линия</param> public ExtendedLine(Grid grid) { this.gridContainer = grid; line = new Line(); }
#region [ Рисование линии, события и прочее связанное с ней ]
public void DrawLine(Point StartPosition, Point EndPosition, double strokeThickness) { line.Stroke = System.Windows.Media.Brushes.LightSteelBlue; line.X1 = StartPosition.X; line.Y1 = StartPosition.Y;
line.X2 = EndPosition.X; line.Y2 = EndPosition.Y;
line.HorizontalAlignment = HorizontalAlignment.Left; line.VerticalAlignment = VerticalAlignment.Top;
line.StrokeThickness = strokeThickness; this.gridContainer.Children.Add(line);
this.AutoDrawEllipseStartLine(); this.AutoDrawEllipseEndLine();
line.Focusable = true;
line.MouseDown += new MouseButtonEventHandler(line_MouseDown); line.MouseMove += new MouseEventHandler(line_MouseMove); line.MouseUp += new MouseButtonEventHandler(line_MouseUp);
line.MouseEnter += new MouseEventHandler(line_MouseEnter); line.MouseLeave += new MouseEventHandler(line_MouseLeave); }
private void line_MouseEnter(object sender, MouseEventArgs e) { //this.ellipseStartLine.Visibility = Visibility.Visible; //this.ellipseEndLine.Visibility = Visibility.Visible; }
private void line_MouseLeave(object sender, MouseEventArgs e) { //this.ellipseStartLine.Visibility = Visibility.Collapsed; //this.ellipseEndLine.Visibility = Visibility.Collapsed; }
private void line_MouseDown(object sender, MouseButtonEventArgs e) { line.CaptureMouse();
this.mouseDownPos = e.GetPosition(this.gridContainer); LinePointA.X = this.line.X1; //записываем в переменную позицию точки А на линии LinePointA.Y = this.line.Y1;
LinePointB.X = this.line.X2; //записываем в переменную позицию точки Б на линии LinePointB.Y = this.line.Y2; }
private void line_MouseMove(object sender, MouseEventArgs e) { this.mouseMovePos = e.GetPosition(this.gridContainer); //получаем координаты мыши относительно грида
if (e.MouseDevice.LeftButton == MouseButtonState.Pressed) { mouseShiftPoint.X = mouseMovePos.X - mouseDownPos.X; mouseShiftPoint.Y = mouseMovePos.Y - mouseDownPos.Y;
this.line.X1 = this.LinePointA.X + mouseShiftPoint.X; this.line.Y1 = this.LinePointA.Y + mouseShiftPoint.Y;
this.line.X2 = this.LinePointB.X + mouseShiftPoint.X; ; this.line.Y2 = this.LinePointB.Y + mouseShiftPoint.Y; ;
ellipseStartLine.Margin = new Thickness(this.line.X1 - this.ellipseEndLine.Width / 2, this.line.Y1 - this.ellipseEndLine.Height / 2, 0, 0); ellipseEndLine.Margin = new Thickness(this.line.X2 - this.ellipseEndLine.Width / 2, this.line.Y2 - this.ellipseEndLine.Height / 2, 0, 0); } }
private void line_MouseUp(object sender, MouseButtonEventArgs e) { line.ReleaseMouseCapture(); }
#region [ Элипс за который можно изменить положение линии в точке А ]
private void AutoDrawEllipseStartLine() { ellipseStartLine = new Ellipse(); this.ellipseStartLine.Visibility = Visibility.Visible; this.ellipseStartLine.Opacity = 0.7;
ellipseStartLine.Stroke = System.Windows.Media.Brushes.Black; ellipseStartLine.Fill = System.Windows.Media.Brushes.Bisque; ellipseStartLine.HorizontalAlignment = HorizontalAlignment.Left; ellipseStartLine.VerticalAlignment = VerticalAlignment.Top; ellipseStartLine.Width = 15; ellipseStartLine.Height = 15;
ellipseStartLine.Margin = new Thickness(this.line.X1 - this.ellipseStartLine.Width / 2, this.line.Y1 - this.ellipseStartLine.Height / 2, 0, 0);
ellipseStartLine.MouseDown += new MouseButtonEventHandler(ellipseStartLine_MouseDown); ellipseStartLine.MouseMove += new MouseEventHandler(ellipseStartLine_MouseMove); ellipseStartLine.MouseUp += new MouseButtonEventHandler(ellipseStartLine_MouseUp);
gridContainer.Children.Add(ellipseStartLine); }
private void ellipseStartLine_MouseUp(object sender, MouseButtonEventArgs e) { ellipseStartLine.ReleaseMouseCapture(); }
private void ellipseStartLine_MouseMove(object sender, MouseEventArgs e) { this.mouseMovePos = e.GetPosition(this.gridContainer); //получаем координаты мыши относительно грида
if (e.MouseDevice.LeftButton == MouseButtonState.Pressed) { this.line.X1 = this.mouseMovePos.X; this.line.Y1 = this.mouseMovePos.Y;
ellipseStartLine.Margin = new Thickness(this.line.X1 - this.ellipseEndLine.Width / 2, this.line.Y1 - this.ellipseEndLine.Height / 2, 0, 0); } }
private void ellipseStartLine_MouseDown(object sender, MouseButtonEventArgs e) { ellipseStartLine.CaptureMouse(); this.mouseDownPos = e.GetPosition(this.gridContainer); }
#endregion
#region [ Элипс за который можно изменить положение линии в точке Б ]
private void AutoDrawEllipseEndLine() { ellipseEndLine = new Ellipse(); this.ellipseEndLine.Visibility = Visibility.Visible; this.ellipseEndLine.Opacity = 0.7;
ellipseEndLine.Stroke = System.Windows.Media.Brushes.Black; ellipseEndLine.Fill = System.Windows.Media.Brushes.Bisque; ellipseEndLine.HorizontalAlignment = HorizontalAlignment.Left; ellipseEndLine.VerticalAlignment = VerticalAlignment.Top;
ellipseEndLine.Width = 15; ellipseEndLine.Height = 15;
ellipseEndLine.Margin = new Thickness(this.line.X2 - this.ellipseEndLine.Width / 2, this.line.Y2 - this.ellipseEndLine.Height / 2, 0, 0);
ellipseEndLine.MouseDown += new MouseButtonEventHandler(ellipseEndLine_MouseDown); ellipseEndLine.MouseMove += new MouseEventHandler(ellipseEndLine_MouseMove); ellipseEndLine.MouseUp += new MouseButtonEventHandler(ellipseEndLine_MouseUp);
gridContainer.Children.Add(ellipseEndLine); }
void ellipseEndLine_MouseUp(object sender, MouseButtonEventArgs e) { ellipseEndLine.ReleaseMouseCapture(); }
void ellipseEndLine_MouseMove(object sender, MouseEventArgs e) { this.mouseMovePos = e.GetPosition(this.gridContainer); //получаем координаты мыши относительно грида
if (e.MouseDevice.LeftButton == MouseButtonState.Pressed) { this.line.X2 = this.mouseMovePos.X; this.line.Y2 = this.mouseMovePos.Y;
ellipseEndLine.Margin = new Thickness(this.line.X2 - this.ellipseEndLine.Width / 2, this.line.Y2 - this.ellipseEndLine.Height / 2, 0, 0); } }
void ellipseEndLine_MouseDown(object sender, MouseButtonEventArgs e) { ellipseEndLine.CaptureMouse(); this.mouseDownPos = e.GetPosition(this.gridContainer); }
#endregion
#endregion } }
|
|