Лучший способ приблизиться к этому - иметь пользовательские элементы управления. Создайте основной пользовательский элемент управления с именем Shape. Затем для каждой фигуры, которую вы хотите, например Line Shape, создайте класс с именем LineShape, производный от Shape. Кроме того, вы, вероятно, также захотите создать интерфейс под названием IShape. Пусть каждый из ваших классов фигур реализует этот интерфейс. Интерфейсы должны содержать методы, которые понадобятся всем формам. Например, вы захотите поместить метод в интерфейс EndPoints (), который определяет конечные точки, которые пользователь может перетаскивать, чтобы изменить размер фигуры. Поскольку каждая фигура будет получена из базового пользовательского элемента управления, у них уже будут возможности перетаскивания.
В каждой фигуре вы хотите нарисовать фигуру в методе рисования. В методе рисования вы можете получить дескриптор объекта Graphics и выполнять примитивные вещи, такие как рисование линий, окружностей или многоугольников.
Ваш «холст» также должен быть пользовательским элементом управления. Вы захотите определить список List<IShape>
для хранения каждого элемента формы, который перетаскивается на холст.
Для перетаскивания вам просто нужно включить это в элементе управления Shape, и он унаследует это от всех других форм. При перетаскивании на холст вы хотите убедиться, что перетаскиваемые данные имеют тип IShape
, а если это так, вы вызовете DoDragDrop()
, что позволит пользователю перетаскивать фигуры на холст.
Если вам нужна помощь, прочтите Интерфейсы и Элементы управления пользователя .
Всегда не забывайте пытаться программировать для интерфейса, и если вы делаете это достаточно хорошо, вы можете даже сделать свои плагины поддержки программы так, чтобы другие разработчики могли писать собственные формы, которые, казалось бы, интегрировались с вашим приложением.