locked
Рисование на Canvas. RRS feed

  • Вопрос

  • Здравствуйте,

    хотелось попробовать написать простую рисовалку. Прям самую простую.

    Давишь мышью-рисуется.

    И вот проблема.

    Рисую так:

    Обрабатываю событие "клик по канвасу":

    private void Canvas_PointerPressed(object sender, PointerRoutedEventArgs e)
            {
                Windows.UI.Input.PointerPoint p =e.GetCurrentPoint(canvas);
                Windows.UI.Xaml.Shapes.Ellipse j = new Windows.UI.Xaml.Shapes.Ellipse();
                j.Height = 10;
                j.Width = 10;
                j.Fill = globColor;
                j.Margin=new Thickness(p.Position.X,p.Position.Y,0,0);
                canvas.Children.Add(j);
            }

    Ну и теперь "движение курсора по канвасу":

    private void can_PointerMoved(object sender, PointerRoutedEventArgs e)
            {
                Windows.UI.Input.PointerPoint p = e.GetCurrentPoint(canvas);
                if (p.IsInContact)
                {
                    Windows.UI.Xaml.Shapes.Ellipse j = new Windows.UI.Xaml.Shapes.Ellipse();
                    j.Height = 10;
                    j.Width = 10;
                    j.Fill = globColor;
                    j.Margin = new Thickness(p.Position.X, p.Position.Y, 0, 0);
                    canvas.Children.Add(j);
                }
            }

    Вот так. Мне казалось,что должно нормально рисоваться, и оно рисуется,если двигать курсор не слишком быстро. Но некоторое ускорение курсора заставляет линию превратиться в пунктир из точек. 
    Создаётся впечатление,что не успевает обработчик отрисовать при быстром движении мышью или координаты курсора меняются не наращиванием на единицу,а именно скачком.

    Есть ли способ,нормально сделать рисование,без разрывов то есть?

    Можно конечно соединять разрывы,запоминая предыдущие координаты курсора,но мне почему-то кажется,что это не самый оптимальный вариант рисования. Может есть другие?

    12 марта 2014 г. 4:59

Ответы

  • Закрываю разрывы точками. Всё работает.

    private void Canvas_PointerPressed_1(object sender, PointerRoutedEventArgs e)
            {
                Windows.UI.Input.PointerPoint p = e.GetCurrentPoint(canvas);
                Windows.UI.Xaml.Shapes.Ellipse j = new Windows.UI.Xaml.Shapes.Ellipse();
                j.Height = 10;
                j.Width = 10;
                j.Fill = globColor;
                j.Margin=new Thickness(p.Position.X-5,p.Position.Y-5,0,0);
                canvas.Children.Add(j);
                pre_p = p;
    
            }
    
    
    
    
    
    private void can_PointerMoved_1(object sender, PointerRoutedEventArgs e)
            {
                Windows.UI.Input.PointerPoint p = e.GetCurrentPoint(eggcan);
                if (p.IsInContact)
                {
                    Windows.UI.Xaml.Shapes.Ellipse j = new Windows.UI.Xaml.Shapes.Ellipse();
                    j.Height = 10;
                    j.Width = 10;
                    j.Fill = globColor;
                    j.Margin = new Thickness(p.Position.X-5, p.Position.Y-5, 0, 0);
                    eggcan.Children.Add(j);
                    Windows.UI.Xaml.Shapes.Polyline jL = new Windows.UI.Xaml.Shapes.Polyline();
                    jL.Points.Add(p.Position);
                    jL.Points.Add(pre_p.Position);
                    jL.Stroke = globColor;
                    jL.StrokeThickness = 10;
                	eggcan.Children.Add(jL);
                    pre_p = p;
                    
                }
            }

     Можно Line использовать,можно Poliline. 
    • Помечено в качестве ответа mpnj 13 марта 2014 г. 6:38
    13 марта 2014 г. 6:37

Все ответы

  • Добрый день.

    Да, самый простой вариант, вы можете сохранять в памяти предыдущие координаты и на событие PointerMoved рисовать прямую из предыдущей точки в текущую. В большинстве случаев такой апроксимации движения мыши хватает.

    12 марта 2014 г. 5:38
    Отвечающий
  • Я понимаю,что это самый простой вариант.

    У меня больше вопрос,а не является ли этот вариант костылём? Может есть какой-то другой более правильный способ?

    Я думал,что может быть я не правильно работаю с событиями мыши или курсором?

    12 марта 2014 г. 9:22
  • попробовал апроксимацию сделать такую,но ничего путного не выходит. Линия выглядит разрывной,когда курсоров по кругу водишь.
    13 марта 2014 г. 6:06
  • Использую 
    Windows.UI.Xaml.Shapes.Line
    13 марта 2014 г. 6:07
  • Закрываю разрывы точками. Всё работает.

    private void Canvas_PointerPressed_1(object sender, PointerRoutedEventArgs e)
            {
                Windows.UI.Input.PointerPoint p = e.GetCurrentPoint(canvas);
                Windows.UI.Xaml.Shapes.Ellipse j = new Windows.UI.Xaml.Shapes.Ellipse();
                j.Height = 10;
                j.Width = 10;
                j.Fill = globColor;
                j.Margin=new Thickness(p.Position.X-5,p.Position.Y-5,0,0);
                canvas.Children.Add(j);
                pre_p = p;
    
            }
    
    
    
    
    
    private void can_PointerMoved_1(object sender, PointerRoutedEventArgs e)
            {
                Windows.UI.Input.PointerPoint p = e.GetCurrentPoint(eggcan);
                if (p.IsInContact)
                {
                    Windows.UI.Xaml.Shapes.Ellipse j = new Windows.UI.Xaml.Shapes.Ellipse();
                    j.Height = 10;
                    j.Width = 10;
                    j.Fill = globColor;
                    j.Margin = new Thickness(p.Position.X-5, p.Position.Y-5, 0, 0);
                    eggcan.Children.Add(j);
                    Windows.UI.Xaml.Shapes.Polyline jL = new Windows.UI.Xaml.Shapes.Polyline();
                    jL.Points.Add(p.Position);
                    jL.Points.Add(pre_p.Position);
                    jL.Stroke = globColor;
                    jL.StrokeThickness = 10;
                	eggcan.Children.Add(jL);
                    pre_p = p;
                    
                }
            }

     Можно Line использовать,можно Poliline. 
    • Помечено в качестве ответа mpnj 13 марта 2014 г. 6:38
    13 марта 2014 г. 6:37