Инструменты рисования для программы, похожей на рисование, в wxWidgets

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

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

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

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


person Zac    schedule 07.05.2011    source источник


Ответы (2)


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

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

- *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, вот введение (в основном окна)

person ravenspoint    schedule 07.05.2011

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

person Joril    schedule 07.05.2011