Как сделать pictureBox1 zoom-point (местоположение курсора) моей исходной точкой? - PullRequest
0 голосов
/ 11 мая 2019

Я очень близок к достижению своей конечной цели, но я не могу этого понять.

На Form1 Load, приложение:

  • Открывает диалоговое окно с изображением.
  • Пользователь выбирает картинку.
  • Изображение загружается в изображение Box1.
  • pictureBox1 теперь можно перетаскивать или увеличивать. Вид ..

У меня вопрос по поводу увеличения. Хотя он работает, он только увеличивает и уменьшает масштаб изображения из верхнего левого угла и обратно в верхний левый угол.

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

Вот мой код, который делает все перечисленное выше, кроме этого.

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

    // ONLY WORKS IN ZOOM MODE UNLESS...?
    pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;

    Image image;

    // LOAD IMAGE CODE
    OpenFileDialog open = new OpenFileDialog();
    // image filters
    open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp; *.tiff)|*.jpg; *.jpeg; *.gif; *.bmp; *.tiff";
    if (open.ShowDialog() == DialogResult.OK)
    {
        image = Image.FromFile(open.FileName);
        pictureBox1.Height = image.Height;
        pictureBox1.Width = image.Width;
        pictureBox1.Image = image;

    }
}

// ZOOM IN/OUT CODE
protected override void OnMouseWheel(MouseEventArgs e)
{
    if (e.Delta != 0)
    {
        if (e.Delta <= 0)
        {
            //set minimum size to zoom
            if (pictureBox1.Width < 100)
                return;
        }
        else
        {
            //set maximum size to zoom
            if (pictureBox1.Width > 700)
                return;
        }
        pictureBox1.Width += Convert.ToInt32(pictureBox1.Width * e.Delta / 1000);
        pictureBox1.Height += Convert.ToInt32(pictureBox1.Height * e.Delta / 1000);
        pictureBox1.Invalidate();
    }

}

// DRAG PICTURE BOX CODE
private bool _moving;
private Point _startLocation;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    _moving = true;
    _startLocation = e.Location;
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    _moving = false;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (_moving)
    {
        pictureBox1.Left += e.Location.X - _startLocation.X;
        pictureBox1.Top += e.Location.Y - _startLocation.Y;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...