Инструменты рисования для подобной программе в wxWidgets - PullRequest
1 голос
/ 07 мая 2011

Я создаю программу в wxWidgets, которая имеет аналогичные функции, скажем, MS Paint, но для более конкретных целей.

Я понимаю различные способы создания объекта с пером / карандашом, который фиксирует один пиксель при перемещении мыши. У меня возникают проблемы с визуализацией - это некоторые другие распространенные инструменты: прямоугольник, овал, линия и т. Д. Для этого вы нажимаете левую кнопку мыши, чтобы установить точку начала координат, и, когда вы перемещаете мышь, она временно визуализирует Наложение фигуры на холсте от начала координат до текущей позиции мыши, окончательная фиксация фигуры на изображении при отпускании кнопки мыши.

Как лучше всего создать этот процесс? Единственное решение, которое я могу придумать, - это сохранить исходную точку при наведении мыши, а при перетаскивании мыши установить временную переменную в текущее положение мыши. Каждый раз, когда изменяется положение мыши, вы бы делали недействительным прямоугольник от исходной точки до сохраненной позиции мыши. Когда кнопка мыши отпущена, форма будет передана модели изображения.

Я еще не реализовал это, поскольку сначала хотел бы получить обратную связь. Это оптимальное решение или оно может вызвать видимое мерцание, когда доступно гораздо более предпочтительное решение?

Ответы [ 2 ]

2 голосов
/ 07 мая 2011

Аппаратные средства отображения видео теперь настолько быстры, что вам, вероятно, не нужно беспокоиться о такой ловкости.

Вот более простой подход

- *Mouse moves with button down and tool X selected*
- IF flagToolInUse THEN remove previous from image model
- flagToolInUse = TRUE
- Update image model with tool X
- Draw image to invisible buffer
- Copy buffer to display
- Done

- *Button released*
- flagToolInUse = FALSE
- Done

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

Если вам нужна дополнительная информация о реализации двойного буферизованного отображения без мерцания с помощью wxWidgets, вот введение (в основном для окон)

1 голос
/ 07 мая 2011

Я бы посоветовал проверить, как они это делают в FloatCanvas .Это для wxPython, но оно должно дать вам некоторые идеи, даже если вы используете "простые" wxWidgets.

...