HitBox элемента не синхронизирован с отрисовкой в ​​OpenTK.WinFormsC#

Место общения программистов C#
Anonymous
HitBox элемента не синхронизирован с отрисовкой в ​​OpenTK.WinForms

Сообщение Anonymous »

Я рисую набор прямоугольников, используя OpenGL через OpenTK. У меня есть GLControl, в котором рисуются прямоугольники. Я реализовал некоторый код для перетаскивания прямоугольников, когда над ними находится курсор. Проблема в том, что когда я перетаскиваю за пределы рисунка, элемент перетаскивается. Иногда элемент можно перетащить снаружи, но иногда он не перетаскивается. Ожидаемое поведение — перетаскивание элемента только тогда, когда мышь находится внутри рисунка, а не снаружи. Перетаскивание изнутри прямоугольника всегда работает, даже если курсор находится рядом с границей. Я реализовал RectangleF как «хитбоксы» таких рисунков. GLControl не заполняет контейнер, он находится внутри панели TabControl, которая находится внутри SplitContainer.
Это событие при нажатии кнопки мыши:

Код: Выделить всё

private void glControlLayout_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
IsDragging = true;

LastMousePosition = new D.Vector2(MousePosition.X, MousePosition.Y);
}
}
Это код, когда я перемещаю мышь:

Код: Выделить всё

private void glControlLayout_MouseMove(object sender, MouseEventArgs e)
{
Point screenMouseCoordinates = new Point(MousePosition.X, MousePosition.Y);
PointF formMouseCoordinates = this.PointToClient(screenMouseCoordinates);

int index;

if(IsDragging != true)
{
if (RectangleList.Count > 0)
{
for (index = 0; index < RectangleList.Count; index++)
{
if (RectangleList[index].RectangleHitBox.Contains(formMouseCoordinates))
{
DraggedRectangle = index;
break;
}
}
}
}

if (IsDragging)
{
if (DraggedRectangle > -1)
{
MoveObject(DraggedRectangle);
}
}
}
Функция MoveObject() работает следующим образом:

Код: Выделить всё

D.Vector2 newMousePosition = new D.Vector2(MousePosition.X, MousePosition.Y);
D.Vector2 delta = newMousePosition - LastMousePosition;

TransformVertices(delta, index);

LastMousePosition = newMousePosition;

glControlLayout.Refresh();
Я просто добавляю дельту ко всем OpenTK Vector2 для каждого движения мыши.
Это мой код VertexShader:

Код: Выделить всё

#version 330 core

uniform mat4 Transformation;

layout (location = 0) in vec2 aPosition;
layout (location = 1) in vec4 aColor;

out vec4 vColor;

void main()
{
gl_Position = vec4(aPosition, 0f, 1f) * Transformation;

vColor = aColor;
}
Матрица преобразования — это просто матрица проекции, которая определяется следующим образом:

Код: Выделить всё

ProjectionMatrix =
Matrix4.CreateOrthographicOffCenter(
0f,
glControl.Width,
0f,
glControl.Height,
-1f,
1f
);

ViewMatrix = Matrix4.Identity;
Я провел небольшое исследование по этому вопросу, но не смог найти ничего похожего на то, что делаю. Проект уже продвинулся довольно далеко, я не думаю, что мы сможем внести изменения в полный код WinForms, но есть ли способ синхронизировать хитбокс с рисунком? Мы выбрали WinForms, чтобы иметь кнопки и платформу для управления вводом с помощью мыши и клавиатуры.

Подробнее здесь: https://stackoverflow.com/questions/786 ... k-winforms

Вернуться в «C#»