Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Линии, прямоугольники, редактируемые объекты и т.д, Внутри код класса линии и объяснение... 
:(
    Опции темы
CasperSC
Дата 23.6.2010, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: 1
Всего: 1



Всем привет! Я пишу редактор для изображений, для своей программы, ну из неё редактор будет получать изображения. И вот мне хотелось бы знать мнение, кого нибудь реально хорошо разбирающегося в 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
    }
}


PM MAIL   Вверх
CasperSC
Дата 24.6.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: 1
Всего: 1



Народ, ну скажите хоть, что нибудь! В общем интересует мнение любого более менее соображающего в программировании человека. Я ведь не просто так этот вопрос тут задал. Уже заколебался обновлять страницу в надежде увидеть, что мне ответили. Что кто думает?
PM MAIL   Вверх
rooks
Дата 30.6.2010, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.9.2008
Где: Минск

Репутация: 5
Всего: 9



вот неплохая статья http://beta.codeproject.com/KB/WPF/WPF_DrawTools.aspx
и вот эта серия статей http://www.codeproject.com/KB/WPF/WPFDiagr...gner_Part1.aspx

Это сообщение отредактировал(а) rooks - 30.6.2010, 00:05
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.