Вложенные пользовательские элементы управления в wxWidgets - PullRequest
0 голосов
/ 07 ноября 2018

Фон

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

Рассмотрим в качестве примера представление схемы (например, для диаграммы UML).Эта диаграмма состоит из узлов и ребер.Каждый узел может содержать кнопку для удаления узла.Возможно, мне также понадобится небольшое увеличенное обзорное изображение всей диаграммы.

Базовая линия

Моя текущая реализация (на основе найденных мной примеров и руководства) представляет собой единый элемент управления диаграммой, который обрабатываетвсе рисунки - края, узлы, кнопки, обзорное изображение, что не так уж и неудобно, потому что я все равно не хочу нативных элементов управления, а также обработку всех событий нажатия на кнопках на основе поиска их координат на экране.

Альтернатива

Но я некоторое время задавался вопросом, действительно ли это правильный путь, и недавно мне пришло в голову, что может быть лучший вариант: сказать (например), что class Node : public wxPanel,внутри этого Node находится кнопка, а остальная часть Node (цвет узла и т. д.) нарисована мной на фоне Node.Затем я помещаю множество Node в class DiagramView : public wxPanel в местах каждого узла диаграммы.Я также помещаю class Overview : public wxControl внутри DiagramView.

Это будет означать, что я добавляю только те Node s к DiagramView, которые видны в данный момент.

У меня естьдобавил набросок моей текущей реализации (вверху) и альтернативы (внизу) ниже.Границы класса отмечены жирными пунктирными линиями.Элементы управления, полностью нарисованные на заказ, - красные, панели - синие.

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

enter image description here

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Обычно вы создаете свой собственный элемент управления так же, как вы создаете диалоговое окно: используете субэлементы и помещаете их в wxPanel с помощью wxSizer`s.

Вам необходимо переопределить виртуальные базовый класс DoGetBestSize() и DoMoveWindow(...).

Вам следует позаботиться о действиях мыши / клавиатуры, если вам это нужно, вместо обработки по умолчанию.

Второй способ - это то, что вы сейчас делаете: рисуйте все и заботьтесь о событиях самостоятельно. Это сложно.

Третий способ - использовать недокументированный класс wxCompositeWindow. Он используется внутренне wxWidgets для создания некоторых элементов управления (общий wxSpinCtrl, wxDateCtrl и т. Д.). Вы можете найти его исходный код и посмотреть, как он работает.

0 голосов
/ 07 ноября 2018

Как почти всегда, нет единого лучшего ответа для всех случаев. В вашем случае, вероятно, лучше всего придерживаться полного пользовательского чертежа, особенно если он реализован и работает. В противном случае, еще одно очень важное соображение - это наложение виджетов-братьев и сестер, что недопустимо. То есть если бы Узел 1, Узел 2, Обзор и т. д. были wxPanel-s, они не могли бы перекрываться. Перекрывающиеся виджеты не поддерживаются, и если разрешить, они будут демонстрировать только странное поведение (которое повлияет на рисование, обработку событий и т. Д.).

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

...