Я создаю редактор векторной графики в WPF. Я визуализирую иллюстрацию, используя D3DImage, настроенный с помощью SharpDX, чтобы использовать его с Direct2D. Когда элемент выбран, вокруг выбранного элемента появляются маркеры изменения размера. Я хочу, чтобы курсор менялся, когда пользователь наводит курсор на эти маркеры изменения размера, но они отображаются в Direct2D и не являются элементами WPF. Как мне это сделать?
Динамический курсор WPF
Ответы (1)
Что ж, если вы выполняете собственный рендеринг в D3DImage, вам нужно провести собственное тестирование попадания.
Если ваша геометрия относительно проста (прямоугольники, круги, полилинии, их не слишком много), вы можете проверить эти формы ручек в обработчике событий перемещения мыши. Либо вручную, либо с помощью, например. FillContainsPoint D2D API .
Или, если вы не делаете что-то очень чувствительное к цвету, например настольную публикацию, вы можете закодировать маркеры изменения размера в цвете ваших фигур. Используйте пару младших битов синего канала (человеческие глаза наименее чувствительны к синему), считывайте цвет под мышкой, изменяйте курсор соответственно значению синего цвета.
Или вы можете переключиться на DXGI_FORMAT_R16G16B16A16_UNORM для цели рендеринга (похоже, что D2D поддерживает этот формат), таким образом вы можете добавить гораздо больше попиксельных данных к вашему изображению без каких-либо видимых артефактов (используйте младшие байты каждого из 3 цветовых каналов) . Однако это усложняет рендеринг, вам нужно будет сделать еще один проход, чтобы преобразовать текстуру в A8R8G8B8 для WPF.
P.S. Интересно, почему вы вместо этого не используете элементы WPF? 2D векторная графика там довольно продвинутая. Вы можете легко создавать/манипулировать/заполнять/намечать эти фигуры программно (просто поместите их на canvas), таким образом WPF будет обрабатывать все эти тесты попадания, рендеринг и многое другое.