У меня есть настраиваемый элемент управления, который отображает изображение. Изображение имеет вокруг него раму с 4-мя размерами в каждом углу. Если пользователь перемещает курсор в ручку размера, он должен иметь возможность изменять размер изображения, сохраняя соотношение сторон.Измените размер изображения с помощью мыши и сохраняйте пропорции
У меня уже есть метод изменения размера, который работает:
public void Resize(float value)
{
if (value == 0f)
value = 0.05f;
//Resize by the same value to keep aspect ratio
var width = (int)(frame.Width * value);
var height = (int)(frame.Height * value);
//Image resizing removed...
}
Resize
метод сам по себе работает, потому что я могу передать любое значение для него, и соотношение сторон сохраняется. И width
, и height
и изменены на то же значение.
Проблема в том, что изменение размера путем перемещения одного из ручек размера не работает должным образом. Кроме того, изображение теряет соотношение сторон. В MouseMove
случае у меня есть:
if (e.Button == MouseButtons.Left)
{
//Get mouse position delta
var x = mousePosition.X - e.Location.X;
var y = mousePosition.Y - e.Location.Y;
if (x == 0 && y == 0)
return;
bool doY = false;
var diff = x;
if (x == 0 && y != 0)
{
diff = y;
doY = true;
}
float width = frame.Width + diff;
float amount = frame.Width/width;
if (doY)
{
float height = frame.Height + diff;
amount = frame.Height/height;
}
Resize(amount);
}
При попытке изменения размера, перемещая курсор мыши, соотношение сторон не соблюдается. В приведенном выше коде я определяю, было ли изменение в x
или y
, и, в зависимости от того, какое значение изменилось, я определяю значение изменения размера.
Есть ли лучший способ получить правильные x
и y
дельтами, и, в зависимости от того, какая рукоятка перемещается, измените размер изображения, сохраняя соотношение сторон?
Что вы подразумеваете под словом «не работает, как ожидалось»? Также подумайте о том, что «var x = mousePosition.X - e.Location.X;» может быть отрицательным числом, я бы использовал «var x = Math.Abs (mousePosition.X - e.Location.X);». Можете ли вы дать нам дополнительную информацию о том, что не работает и, возможно, больше кода для захватов по размеру, если они не работают. – MrApnea
@FSDaniel Да 'x' может быть отрицательным числом, что может означать, что размер рамки будет меньше, в зависимости от того, какой размер захвата перетаскивается. Размерные ручки - это просто прямоугольники, нарисованные на углах рамы, и я проверяю, какой размер захвата перетаскивается, вызывая метод «Содержит» на прямоугольниках. –