Я очень близок к достижению своей конечной цели, но я не могу этого понять.
На 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;
}
}