Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2018, 13:19   #1
Anton_Jag
Пользователь
 
Регистрация: 05.11.2009
Сообщений: 41
По умолчанию Рисование мышкой на PictureBox

Пытаюсь сделать графический редактор типа Пейнт.
Возникла проблема с отрисовкой на PictureBox.Image
Пробовал рисовать двумя способами - оба по событию мыши MouseMove - первое использует Graphics.DrawLine() второе Graphics.FillRectangle
В первом случае получается елочка при движении не перпендикулярно осям, во втором - тормоза - не успевает отрисовывать, получаются отдельные точки при быстром движении мыши. Вопрос - можно ли как то адекватно реализовать рисование жирными линиями?
Код:
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {// зажата левая кнопка
            if (e.Button == MouseButtons.Left)
            {// если операция карандаш или кисть
                if (CurrentOp == operation.None || CurrentOp == operation.brush)
                {
                    Graphics g = Graphics.FromImage(pictureBox1.Image);
                    Brush Br = new SolidBrush(CurrentColorPB.BackColor);
                    // то рисуем на картинке
                    PaintRect.Location = e.Location;
                    g.FillRectangle(Br, PaintRect);
                    //g.DrawLine(WhitePen, PreviousPoint, e.Location); -  2 способ
                    Br.Dispose();
                    pictureBox1.Refresh();
                    //PreviousPoint = e.Location;
                }
Изображения
Тип файла: png 2018-11-06 12_58_11-Графический редактор.png (19.7 Кб, 314 просмотров)
Тип файла: png 2018-11-06 13_18_40.png (22.5 Кб, 312 просмотров)
Anton_Jag вне форума Ответить с цитированием
Старый 06.11.2018, 22:46   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Во-первых, заводите отдельный битмап, который храните в памяти, и по таймеру его выставляете на экран.
Код:
        
pictureBox2->Image = (Bitmap)internal_bitmap.Clone();
Во-вторых, для рисования отдельных точек нужно использовать не Graphics, а Bitmap.SetPixel.

Код:
void OnMouseMove(sender, args)
{
     if(args.Pressed)
     {
         internal_bitmap.SetPixel(args.Location, CurrentColor);
     }
}
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 06.11.2018, 22:48   #3
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

У Вас изменение Bitmap и отрисовка должны быть независимы.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 08.11.2018, 15:24   #4
Anton_Jag
Пользователь
 
Регистрация: 05.11.2009
Сообщений: 41
По умолчанию

А как тогда если я хочу рисовать линию в 10 пикселей? Получается нужно все равно писать свой Fill вокруг текущих координат мыши с радиусом в 10. Разве это быстрее будет работать чем встроенные функции? При рисовании DrawLine с Pen толщиной 1 или 2 проблем нет все работает быстро и рисует то что надо. Проблемы возникают когда размер пера увеличивается. Допустим если Pen равен 5 пикс, то мой алгоритм будет рисовать линиями длинной в пять(отсюда и елочка) и во втором случае закрашивать круги радиусом пять, но с тормозами.
Anton_Jag вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ рисование в pictureBox VIK_aka_TOR Помощь студентам 0 30.03.2012 01:10
Рисование мышкой Victor1963 Общие вопросы Delphi 0 01.07.2011 21:33
Рисование мышкой Victor1963 Помощь студентам 2 19.04.2011 12:43
Рисование мышкой Victor1963 Помощь студентам 0 13.04.2011 19:28
Рисование мышкой vandrouny Win Api 1 03.10.2010 19:57