Как исправить задержку между колесом мыши вверх и вниз при обновлении окна изображения при масштабировании прямоугольника или фигуры на объекте GraphicsPath в C #? - PullRequest
0 голосов
/ 24 апреля 2019

1. Я пытаюсь масштабировать прямоугольник, пока пользователь нажимает кнопку мыши вверх и вниз в графическом окне.
2.После того, как вы нажмете 5 колесиков мыши вверх, и если вы нажмете колесико мыши вниз, прямоугольник по-прежнему сохранит масштабы.вверх (расширяется).
3. Есть ли какое-нибудь решение?

GraphicsPath path=new GraphicsPath();
private float scale=1.0F;
private bool ActiveWheel=false;
public Form1()
{
    path.AddRectangle(new Rectangle(10,10,50,100));
}
private void PictureBox1_Paint(object sender,PaintEventArgs e)
{
    if(ActiveWheel)
    {
        ActiveWheel=false;
        ScaleRectangle(e);

    }
else
{
   e.Graphics.DrawPath(Pens.Red,path);
}

}
private void PictureBox1_MouseWheel(object sender,MouseEventArgs e)
{
    ActiveWheel=true;
    scale=Math.Max(scale+Math.Sign(e.Delta)*0.1F,0.1F);
    pictureBox1.Refresh();
}
}
private void ScaleRectangle(PaintEventArgs e)
{
    var matrix=new Matrix();
    matrix.Scale(scale,scale,MatrixOrder.Append);
    path.Transform(matrix);
    e.Graphics.DrawPath(Pens.Blue,path);
}

Любое решение или идея, как внезапно уменьшить или уменьшить фигуру без задержки между подъемами колесика мыши и спусками колесика мыши(см. 2. если хотите увидеть на самом деле o / p).

1 Ответ

0 голосов
/ 24 апреля 2019

Просто отрегулируйте значение масштаба в событии MouseWheel (), затем ScaleTransform () поверхность GRAPHICS (не сам Path) в событии Paint () и нарисуйте:

public partial class Form1 : Form
{

    private GraphicsPath path = new GraphicsPath();
    private float scale = 1.0F;

    public Form1()
    {
        InitializeComponent();
        path.AddRectangle(new Rectangle(10, 10, 50, 100));
        pictureBox1.MouseWheel += PictureBox1_MouseWheel;
        pictureBox1.Paint += pictureBox1_Paint;
    }

    private void PictureBox1_MouseWheel(object sender, MouseEventArgs e)
    {
        scale = Math.Max(scale + Math.Sign(e.Delta) * 0.1F, 0.1F);
        pictureBox1.Invalidate();
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.ScaleTransform(scale, scale);
        e.Graphics.DrawPath(Pens.Red, path);
    }

}

-- РЕДАКТИРОВАТЬ ---

Это масштабируется целиком, не могли бы вы показать мне, как масштабировать только объект графического контура и верхний, левый должны быть исправлены, то есть без масштабирования верхней, левой точки?

В этом случае переведите курсор в верхнюю левую точку вашего прямоугольника, масштабируйте, а затем верните обратно в начало координат.Теперь нарисуйте НЕИЗМЕНЕННЫЙ прямоугольник:

    private void PictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.TranslateTransform(10, 10);
        e.Graphics.ScaleTransform(scale, scale);
        e.Graphics.TranslateTransform(-10, -10);
        e.Graphics.DrawPath(Pens.Red, path);
    }

Если у вас есть другие элементы, которые рисуются в разных позициях и / или масштабах, то вы можете сбросить графическую поверхность до и после (каждый «элемент» может сделатьвещи того же типа, чтобы позиционировать и масштабировать себя):

    private void PictureBox1_Paint(object sender, PaintEventArgs e)
    {

        // possibly other drawing operations

        e.Graphics.ResetTransform();
        e.Graphics.TranslateTransform(10, 10);
        e.Graphics.ScaleTransform(scale, scale);
        e.Graphics.TranslateTransform(-10, -10);
        e.Graphics.DrawPath(Pens.Red, path);
        e.Graphics.ResetTransform();

        // possibly other drawing operations

    }

Этот подход хорош, поскольку он сохраняет исходную информацию о вашем прямоугольнике;изменение просто визуально.

...