Динамический курсор WPF

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


person laptou    schedule 07.07.2017    source источник


Ответы (1)


Что ж, если вы выполняете собственный рендеринг в D3DImage, вам нужно провести собственное тестирование попадания.

Если ваша геометрия относительно проста (прямоугольники, круги, полилинии, их не слишком много), вы можете проверить эти формы ручек в обработчике событий перемещения мыши. Либо вручную, либо с помощью, например. FillContainsPoint D2D API .

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

Или вы можете переключиться на DXGI_FORMAT_R16G16B16A16_UNORM для цели рендеринга (похоже, что D2D поддерживает этот формат), таким образом вы можете добавить гораздо больше попиксельных данных к вашему изображению без каких-либо видимых артефактов (используйте младшие байты каждого из 3 цветовых каналов) . Однако это усложняет рендеринг, вам нужно будет сделать еще один проход, чтобы преобразовать текстуру в A8R8G8B8 для WPF.

P.S. Интересно, почему вы вместо этого не используете элементы WPF? 2D векторная графика там довольно продвинутая. Вы можете легко создавать/манипулировать/заполнять/намечать эти фигуры программно (просто поместите их на canvas), таким образом WPF будет обрабатывать все эти тесты попадания, рендеринг и многое другое.

person Soonts    schedule 07.07.2017
comment
Я использую Direct2D, потому что хочу, чтобы моя программа была максимально производительной. Тем не менее, я решил эту проблему, просто проверив дескрипторы в обработчике MouseMove, а затем установив курсор. - person laptou; 08.07.2017
comment
@333 Почему вы думаете, что рендеринг D2D значительно более эффективен, чем WPF? Они оба используют D3D под капотом. WPF использует более старую версию D3D, поэтому некоторые вещи в D2D действительно более эффективны. Однако D2D реализует немедленный рендеринг в режиме, он будет тратить время на управление этими ресурсами графического процессора (графические процессоры больше не поддерживают немедленную отрисовку). - person Soonts; 08.07.2017