Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Naomis
7 / 7 / 4
Регистрация: 11.03.2015
Сообщений: 212
Завершенные тесты: 1
1

(wpf) InkCanvas отрисовка базовых фигур

19.01.2017, 17:06. Просмотров 478. Ответов 0
Метки wpf (Все метки)

Доброго дня. Создаю "рисовалку" и мне нужна возможность создания базовых фигур, то есть как в paint'е(прямоугольник заполненный/незаполненный, круг заполненный/незаполненный, линия, разная толщина на эти плюшки). Изгуглил много чего и много чего нашел, есть разные методы. Я нашел довольно презентабельный путь для этого на MSDN. Во втором подходе предлагается переопределить метод DrawCore класса Stroke. Описано довольно подробно, так же есть другие примеры на эту тему(раз, два), но моя проблема в том, что я в упор не понимаю как соединить одно с другим.

У меня есть холст(inkCanvas), методы которые с ним работают(рисовать, стирать и тд), добавляю по соседству класс CustomStroke наследуемый от Stroke. И... Что дальше? Метод DrawCore переопределен, но как связать это всё во едино? Я так понимаю, что нужно как-то подключить класс? Но я опять же не понимаю где взять StylusPointCollection. Прошу немного пояснить, что мне следует сделать.

Вот код класса:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
    public class CustomStroke : Stroke
    {
        public CustomStroke(StylusPointCollection pts) : base(pts)
        {
            this.StylusPoints = pts;
        }
 
        protected override void DrawCore(DrawingContext drawingContext, DrawingAttributes drawingAttributes)
        {
            if (drawingContext == null)
            {
                throw new ArgumentNullException("drawingContext");
            }
            if (null == drawingAttributes)
            {
                throw new ArgumentNullException("drawingAttributes");
            }
            DrawingAttributes originalDa = drawingAttributes.Clone();
            SolidColorBrush brush2 = new SolidColorBrush(drawingAttributes.Color);
            brush2.Freeze();
            drawingContext.DrawRectangle(brush2, null, new Rect(GetTheLeftTopPoint(), GetTheRightBottomPoint()));
        }
 
        System.Windows.Point GetTheLeftTopPoint()
        {
            if (this.StylusPoints == null)
                throw new ArgumentNullException("StylusPoints");
            StylusPoint tmpPoint = new StylusPoint(double.MaxValue, double.MaxValue);
            foreach (StylusPoint point in this.StylusPoints)
            {
                if ((point.X < tmpPoint.X) || (point.Y < tmpPoint.Y))
                    tmpPoint = point;
            }
            return tmpPoint.ToPoint();
        }
 
        System.Windows.Point GetTheRightBottomPoint()
        {
            if (this.StylusPoints == null)
                throw new ArgumentNullException("StylusPoints");
            StylusPoint tmpPoint = new StylusPoint(0, 0);
            foreach (StylusPoint point in this.StylusPoints)
            {
                if ((point.X > tmpPoint.X) || (point.Y > tmpPoint.Y))
                    tmpPoint = point;
            }
            return tmpPoint.ToPoint();
        }
    }
За ранее спасибо.

Добавлено через 1 час 12 минут
Решено

C#
1
2
3
            inkCanvas.PreviewMouseDown += inkCanvas_MouseDown;
            inkCanvas.PreviewMouseMove += inkCanvas_MouseMove;
            inkCanvas.PreviewMouseUp += inkCanvas_MouseUp;
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
        Point currentPoint, mouseLeftDownPoint;
        bool IsDrawing = false;
        private void inkCanvas_MouseDown(Object sender, MouseEventArgs e)
        {
            IsDrawing = true;
            mouseLeftDownPoint = e.GetPosition((IInputElement)sender);
        }
 
        Stroke st = null;
        private void inkCanvas_MouseMove(Object sender, MouseEventArgs e)
        {
            if (IsDrawing)
            {
                currentPoint = e.GetPosition((IInputElement) sender);
                StylusPointCollection pts = new StylusPointCollection();
 
                pts.Add(new StylusPoint(mouseLeftDownPoint.X, mouseLeftDownPoint.Y));
                pts.Add(new StylusPoint(currentPoint.X, currentPoint.Y));
 
                if (st != null)
                    inkCanvas.Strokes.Remove(st);
                st = new CustomStroke(pts);
 
                st.DrawingAttributes.Color = Colors.DarkOrange;
                inkCanvas.Strokes.Add(st);
            }
        }
        private void inkCanvas_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (st != null)
            {
                inkCanvas.Strokes.Remove(st);
                inkCanvas.Strokes.Add(st.Clone());
            }
            IsDrawing = false;
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class CustomStroke : Stroke
    {
        public CustomStroke(StylusPointCollection pts) : base(pts)
        {
            this.StylusPoints = pts;
        }
 
        protected override void DrawCore(DrawingContext drawingContext, DrawingAttributes drawingAttributes)
        {
            if (drawingContext == null)
            {
                throw new ArgumentNullException("drawingContext");
            }
            if (null == drawingAttributes)
            {
                throw new ArgumentNullException("drawingAttributes");
            }
            DrawingAttributes originalDa = drawingAttributes.Clone();
            SolidColorBrush brush2 = new SolidColorBrush(drawingAttributes.Color);
            brush2.Freeze();
            //drawingContext.DrawRectangle(brush2, null, new Rect(GetTheLeftTopPoint(), GetTheRightBottomPoint()));
 
            StylusPoint stp = this.StylusPoints[0];
            StylusPoint sp = this.StylusPoints[1];
            double radius = System.Math.Sqrt(System.Math.Pow((double)(sp.X - stp.X), 2) + System.Math.Pow((double)(sp.Y - stp.Y), 2))/2.0;
 
            drawingContext.DrawEllipse(brush2, null, new Point((sp.X + stp.X) / 2.0, (sp.Y + stp.Y) / 2.0), radius, radius);
        }
 
        System.Windows.Point GetTheLeftTopPoint()
        {
            if (this.StylusPoints == null)
                throw new ArgumentNullException("StylusPoints");
            StylusPoint tmpPoint = new StylusPoint(double.MaxValue, double.MaxValue);
            foreach (StylusPoint point in this.StylusPoints)
            {
                if ((point.X < tmpPoint.X) || (point.Y < tmpPoint.Y))
                    tmpPoint = point;
            }
            return tmpPoint.ToPoint();
        }
 
        System.Windows.Point GetTheRightBottomPoint()
        {
            if (this.StylusPoints == null)
                throw new ArgumentNullException("StylusPoints");
            StylusPoint tmpPoint = new StylusPoint(0, 0);
            foreach (StylusPoint point in this.StylusPoints)
            {
                if ((point.X > tmpPoint.X) || (point.Y > tmpPoint.Y))
                    tmpPoint = point;
            }
            return tmpPoint.ToPoint();
        }
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2017, 17:06
Ответы с готовыми решениями:

Удаление фигур из InkCanvas.Children
Доброй ночи! Прошу помочь разобраться. В программе-рисовалке идёт добавление...

Неправильная отрисовка фигур
Доброй ночи! Прошу помочь разобраться с ошибкой в работе программы-рисовалки...

Отрисовка сложных фигур на canvas
собственно вопрос, как из простых фигур, можно делать сложные? Когда я рисовал...

WPF canvas отрисовка точки
Здравствуйте уважаемые Форумчане. Может что то не правильно понимаю, так как...

Отрисовка большого количества треугольников в WPF
При работе в Windows Form мне нужно было выводить сетку из треугольников (около...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2017, 17:06

Отрисовка графикОВ вручную в реальном времени в WPF
Здравствуйте. (знакомлюсь с wpf) Суть такова: есть функция, в силу...

Графика с WPF (рисование фигур)
Ребята помогите пожалуйста! Ситуация следующая, необходимо нарисовать фигуру...

Нужны примеры сложных фигур на WPF XAML
У кого нибудь есть примеры сложных фигур на WPF XAML ? ) помимо кубов всяких....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru