C#. WPF приложение для рисования, часть 6. Выделение нарисованных объектов

Рис.1. Выделение нарисованных объектов

Компьютерная графика в отличие от бумажной позволяет довольно просто перемещать объекты. Особенно, если работа ведется с векторными объектами или с отдельными слоями растрового изображения.

 

У контрола InkCanvas есть свойство EiditingMode (дословно - режим редактирования), позволяющий менять режим его работы.

Возможные значения свойства:

  • Ink – это режим по умолчанию, позволяет рисовать мышкой;
  • GestureOnly – след на экране показывается только тогда, когда зажата левая кнопка мышки. Как только кнопка отпущена, нарисованное пропадает. Такой режим хорош для указания на какую-то часть изображения при проведении презентации;
  • InkAndGesture—интересный режим, позволяет как рисовать, так и удалять не рисовать
  • EraseByStroke - в этом режиме в InkCanvas происходит удаление штриха при клике.
  • EraseByPoint - удаление рисунка по точкам;
  • Select – в этом режиме можно выделять объекты для их дальнейшего перемещения или удаления. Для выделения нужно обвести объект или кликнуть на него;
  • None - запрет ввода рисунка.

 

Итак, для возможности выделения нарисованных объектов необходимо установить для свойства InkCanvas EditingMode значение Select.

Разместим в окне приложения кнопку "Выделить" со свойствами x:Name="btn_Select" и назначим обработчик для нажатия btn_Select_Click.

 

        <Button x:Name="btn_Select" Content="Выделить" HorizontalAlignment="Left" Margin="546,183,0,0" VerticalAlignment="Top" Width="75" Click="btn_Select_Click"/>

В обработчике установим свойству EditingMode значение Select.

        private void btn_Select_Click(object sender, RoutedEventArgs e)
        {
            this.inkCanvas1.EditingMode = InkCanvasEditingMode.Select;
        }

При нажатии кнопки "Выделить" InkCanvas переключается в режим Select, из-за чего рисовать больше нельзя, но можно двигать или удалять выделенные объекты (Рис.1).

Рис.1. Выделение нарисованных объектов

Рис.1. Выделение нарисованных объектов

 

А теперь попробуйте сохранить изображение, когда объект выделен. Результат не тот, что ожидали – выделение также сохранено. Потому теперь добавьте в обработчик кнопки сохранения файла перевод EditingMode сначала в режим None, потом в Ink.

 

        private void btn_Save_Click(object sender, RoutedEventArgs e)
        {
            this.inkCanvas1.EditingMode = InkCanvasEditingMode.None;
            string imgPath = @"C:\Temp\file.gif"; //Куда сохраняется файл
            MemoryStream ms = new MemoryStream();  //Поток памяти :)
            FileStream fs = new FileStream(imgPath, FileMode.Create); //  Поток файла :)

            //rtb - объект класса RenderTargetBitmap
            RenderTargetBitmap rtb = new RenderTargetBitmap((int)inkCanvas1.Width, (int)inkCanvas1.Height, 96, 96, PixelFormats.Default);
            rtb.Render(inkCanvas1);

            GifBitmapEncoder gifEnc = new GifBitmapEncoder(); //сохраняем в формате GIF
            gifEnc.Frames.Add(BitmapFrame.Create(rtb));
            gifEnc.Save(fs);
            fs.Close();
            this.inkCanvas1.EditingMode = InkCanvasEditingMode.Ink;
            MessageBox.Show("Файл сохранен, " + imgPath); //Для информации
        }

 

Задание:

Доработайте обработчик событий btn_Select_Click так, чтобы можно было менять режим работы InkCanvas с режима рисования Ink на режим выделения Select и обратно.

 

 


Комментариев нет »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment






MarkiMarta.ru. Записки отца-программиста" с 2009 г.
Категория информационной продукции 18+
Яндекс.Метрика