2014-02-19 2 views
0

Проведя довольно много времени с помощью Direct2D (1_1), я ищу информацию о создании автономных элементов управления с Direct2D, в первую очередь с помощью макета для тестирования и абстрагирования.Хорошая стратегия для создания автономных элементов управления Direct2D

Создание всей сцены достаточно просто (спасибо Кенни Керру), однако я не нашел хорошей стратегии для разделения кода на компоненты многоразового интерфейса.

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

[EDIT 19 февраля - 7 утра]

Рассмотрим очень простой пример: рендеринга (или Draw) функция делает несколько скругленные Rect геометрий, некоторые из которых перекрываются. Теперь давайте рассмотрим каждый из этих закругленных прямоугольников как независимый контроль ui. Таким образом, мы абстрагируем, что закругленный прямоугольник в свой класс, предоставляем функцию рендеринга, которая имеет параметр цели рендеринга и точку, в которой нужно рисовать. Но многое еще нужно рассмотреть. Контроль не обязательно должен знать, где он находится. Важной будет и общая стратегия тестирования ударов, которую наша система может продолжать наращивать.

Как указано в @CodeAngry, должны быть реализованы свойства, такие как видимые, активированные, zOrder, ширина, высота и т. Д. Но система компоновки должна быть нашей отправной точкой.

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

+1

Это сложный вопрос, и тот, который я не уверен, обязательно соответствует типичному вопросу, заданному в stackoverflow. Это скорее вопрос дизайна, чем вопрос программирования. Также я чувствую, что вопрос неудобно сформулирован, поэтому я не совсем уверен, что вы ищете. – leetNightshade

+1

Вы не упомянули об этом, но я предполагаю, что вы используете WPF для обработки ввода? Никогда не использовал это сам, только DirectInput или XInput в приложениях C++ Windows. Не знаете, что вы подразумеваете под автономным контролем, можете ли вы уточнить? Вы пытаетесь создать портативный абстрактный интерфейс, который можно использовать в разных API/платформах? Вы ищете абстрактные действия над абстрактным кодом управления? Вам нужно выяснить, что именно вы хотите, и уточнить. Вопрос такой расплывчатый. – leetNightshade

+0

* FUNNY *: В настоящее время я работаю над пользовательским интерфейсом без окон для собственного C++, созданного на D2D1 и DW и WIC. Я нахожусь на том же самом шаге, что и вы, делая первичный HWND визуализирующим поверхность прокручиваемым, взаимодействуя с элементами управления, а затем создавая настраиваемые элементы управления. Но я пишу его для родного C++, а не с поддержкой C#. – CodeAngry

ответ

1

Общий хит тестирование может быть сделано, делая что-то вроде этого:

  • каждый элемент управления должен иметь геометрию из его расположение. Либо основной прямоугольник, эллипс, неправильная форма. Затем диспетчер управления делает тестирование против них. Затем заказывает возможные совпадения по zorder
  • просто ударил-тесты против них в zorder, чтобы предотвратить этап сортировки.

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

Элементы управления не должны знать об их местоположении, но НЕОБХОДИМО знать их размеры. (если прямоугольный) и/или формы. И менеджер знает местоположение и ограничивающий прямоугольник. Объедините эти элементы, и вы можете пройти тест. Сначала убедитесь, что точка попадает в ограничивающий прямоугольник и только затем проверяется на соответствие геометрии элемента управления. Перед ударом-тестированием обновите клиентский пункт HWND на контрольную точку клиента, вычитая смещения клиентского контроля, известные диспетчеру управления.

Вот как я (планирую) это делать. Но я делаю это без окон. Если каждый элемент управления находится у ребенка HWND, жизнь намного проще!

PS: Вы можете выслать мне письмо, если хотите обменяться идеями. Вы можете найти мой адрес электронной почты, если хотите. ;)

+0

Согласен. Менеджер управления также может быть абстрагирован для повторного использования на любом контроле контейнера. Я также хотел бы, чтобы это было без окон, однако не было уверенности в том, как отделить цели рендеринга. Итак, если вы создаете каждый ограничивающий прямоугольник на основе требуемой ширины и высоты элемента управления и визуализируете в дочернем HWND, тогда коорды будут начинаться с верхнего левого нуля? и функция рендеринга будет выглядеть примерно так: void Render (HWND hwnd, граница RECT); ? Возможно, базовый элемент управления, который обеспечивает многие другие свойства. Спасибо за ваши мысли. – Jeff

+0

Это C++. У вас есть базовый элемент управления с виртуальными функциями. Если вы хотите их избежать, используйте обратные вызовы типа C, хранящиеся в вашей DLL или библиотеке. Базовый элемент управления предоставляет некоторые функции, и пользователь может создавать новые элементы управления, используя эти предопределенные или создающие новые над базовым элементом управления. Кроме того, вы можете использовать 'PushAxisAlignedClip()' и 'PopAxisAlignedClip()' to * (необязательно) * визуализацию управления клипами для своих ограничивающих прямоугольников. --- HWND должен быть 'ID2D1RenderTarget *' для элементов управления. Не создавайте новый каждый раз, если без окон. – CodeAngry

+0

А! Вот некоторые из недостатков (PushAxisAlignedClip() и PopAxisAlignedClip()). И обеспечение HWND реализует ID2D1RenderTarget *. Еще раз спасибо за ваши мысли. – Jeff

Смежные вопросы