С wxWidgets есть простой способ нарисовать линии между элементами в двух списках? - PullRequest
1 голос
/ 05 января 2012

В частности, в wxHaskell, но в целом хотелось бы иметь возможность рисовать линии между элементами в двух списках, расположенных рядом, чтобы показать, что между элементами есть связь.Что-то вроде макета ниже.

two list boxes with arrows between items

Ответы [ 2 ]

1 голос
/ 05 января 2012

Возможно, в вашей настройке есть что-то, чего я не понимаю, но это кажется совершенно простым.

Предположим, вы хотите нарисовать линию между входом один и выходом три.

  • Вам необходимо четыре координаты в системе координат окна, которое являетсяродитель двух списков.Давайте назовем их xi, yi, xo, yo

  • xi и xo являются постоянными

  • Yi и yo зависят только от высотыодна строка в ваших списках и порядковый номер элементов.

  • Теперь создайте wxClientDC из родительского окна

  • И нарисуйте свою линию вDC.

    parentWindowDC.DrawLine (xi, yi, xo, yo);

Я заметил, что вы показали стрелки в верхней части окон списка.Выше будет рисовать их сзади.Чтобы нарисовать их сверху, вам нужно будет немного вычислить геометрию, а затем вычислить точки, где линия (xi, yi, xo, yo) пересекает края двух списков.Затем вы рисуете три линии, используя ту же кисть,

  • между xi, yi и пересечением с краем поля ввода в окне ввода DC
  • между двумя пересечениями в родительском элементе.окно DC
  • между краем поля вывода и xo, yo в окне вывода DC
0 голосов
/ 05 января 2012

В wxWidgets нет класса для этого, но есть некоторые возможные обходные пути:

  • Если вам нужно кроссплатформенное решение, то, безусловно, не существует простого способа реализовать это. Вы можете попытаться создать непрямоугольное окно верхнего уровня, которое имеет форму этих стрелок, и переместить его вместе с рамкой. Это ужасное решение, но я упомянул его только к вашему сведению.
  • Если ваше приложение только для Windows, вы можете попробовать прочитать статью Locus Effect в CodeProject. Может быть, это даст подсказку о том, как можно реализовать желаемую функциональность
  • Для Windows, я думаю, вы также можете использовать DirectX Overlay или просто непрямоугольный элемент управления, используя функцию SetWindowRgn . У меня отлично получилось для непрямоугольных кнопок, так что должно работать в вашем случае.
  • Любое другое решение будет зависеть от платформы и потребует «собственного» кодирования IMHO.
...