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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование кистью в PictureBox, Реализация рисования мышкой 
:(
    Опции темы
albert21
Дата 19.4.2008, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет.

На форуме Vingrad я нашёл пример рисования линий в PictureBox (за исходник большое спасибо!). Там создавался список объектов класса "Line", которые себя отрисовывали.

Я хочу реализовать рисование заданной кистью с помощью мышки, как в большинстве редакторов.

Создал класс, который будет рисовать залитую окружность и список объектов этого класса. В обработчике события мыши OnMove создаю объект окружности, добавляю его в сисок, а в  OnPaint отрисовываю все элементы списка. 
Если двигать мышью медленно, то получается жирный след траектории движения мыши, такой, каким он и задумывался smile (залитые окружности рисуются рядом одна за другой).

Если двигать мышью быстро, то получается след из ряда залитых окружностей, между которыми есть пустое пространство. Складывается такое ощущение как будто событие OnMove генерится слишком редко smile.

user posted image
Постарался изобразить на картинке.

Вопрос: как добиться ровной отрисовки кистью не зависимо от скорости движения мышкой?

P.S: Двойная буферизация включена
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
vponomarov
Дата 19.4.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



albert21, можно попробовать рисовать не отдельные окружности, а кривые.
т.е. когда пользователь нажал кнопку мыши - создали новый объект, записали начальную точку.
при каждом событии MouseMove добавляем новую точку (тут можно подумать над оптимизацией, чтобы не добавлять слишком много промежуточных точек)
когда отпустили кнопку мыши - все, закончили свою кривую.
для хранения информации о кривой можно использовать список точек и кривую рисовать сегментами между соседними точками.
или как вариант можно использовать класс GraphicPath.


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
albert21
Дата 21.4.2008, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Построение кривой это вариант, но он не подходит если размер кисти равен 1 пикселю, получится ломаная. GraphicPath входит в стандартные набор библиотеки? Что он умеет? В каком пространстве имён объявлен?
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
amarenkov
Дата 21.4.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(albert21 @  21.4.2008,  06:45 Найти цитируемый пост)
... он не подходит если размер кисти равен 1 пикселю


Почему ?

Обычно подобные вещи так и организуются: запоминаются точки по MouseMove и соединяются DrawLine или чем-нибудь типа того.

PM MAIL ICQ   Вверх
vponomarov
Дата 21.4.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(albert21 @  21.4.2008,  06:45 Найти цитируемый пост)
GraphicPath входит в стандартные набор библиотеки? Что он умеет? В каком пространстве имён объявлен? 

да, это стандартный класс.
пространство имен System.Drawing.Drawing2D.
Цитата(albert21 @  21.4.2008,  06:45 Найти цитируемый пост)
Что он умеет?

как раз строит линии (в том числе кривые) по точкам. почитай в МСДНе smile 


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Dgedit
Дата 18.10.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ребят, аналогичная проблема. Неужели нельзя поменять настройки чтобы мышь двигалась последовательно?? Мне не очень нравится вариант с рисованием кривой.
PM MAIL   Вверх
nmn
Дата 25.10.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Dgedit @ 18.10.2009,  20:57)
Ребят, аналогичная проблема. Неужели нельзя поменять настройки чтобы мышь двигалась последовательно?? Мне не очень нравится вариант с рисованием кривой.

это оптимизация и решается на уровне ос, если мышь будет двигаться слишком быстро будет очень много сообщений перемещения и производительность упадет

для решения проблемы рисуй не точку, а рисуй прямую из последней позиции мыши в текущую
PM Skype   Вверх
AlexLakers
Дата 25.10.2009, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Если двигать мышью медленно, то получается жирный след траектории движения мыши, такой, каким он и задумывался  (залитые окружности рисуются рядом одна за другой).

Того же самого эффекта можно добиться, если между всеми точками нарисовать линии и в каждой точке круг (в месте соединения двух линий). 
Или же все сделать одним методом Grapthics.DrawLines(Pen, points). Но у Pen установить свойство LineJoin в Round, а так же свойства вида начала и конца. Будет то, что тебе нужно. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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