Как я могу убедиться, что моя графика нарисована в правильном месте в форме C# windows?
У меня есть проект windows form, в котором пользователь рисует линии на изображении в pictureBox (поверх панели). Когда поле изображения находится в режиме масштабирования по умолчанию, линии рисуются правильно, и они правильно реагируют на то, что изображение неровное. Однако, когда я пытаюсь нарисовать изображение при увеличении/уменьшении, положение линии смещается (вверх и влево при уменьшении, вниз и вправо при увеличении). PictureBox и панель закреплены на всех четырех сторонах и не закреплены. Я попытался использовать метод TranslateTransform( dx, dy), но он не сработал. Я также попытался избавиться от своего метода CenterBox (). Как мне действовать дальше?
Вот код для масштабирования:
private void trackBar1_Scroll(object sender, EventArgs e) // zoom scale { zoom = (float)(0.25 + 0.25 * (trackBar1.Value - 1)); if (trackBar1.Value > 0) { pictureBox1.Image = PictureBoxZoom(imgOriginal, new Size(trackBar1.Value, trackBar1.Value)); } } public Image PictureBoxZoom(Image img, Size size) //creates zoomed in clone of user image { sizeNewx = (Int32) (img.Width * zoom); sizeNewy = (Int32) (img.Height * zoom); Bitmap bm = new Bitmap(img, sizeNewx,sizeNewy); Graphics grap = Graphics.FromImage(bm); grap.InterpolationMode = InterpolationMode.HighQualityBicubic; CenterBox(pictureBox1, bm); return bm; } private void CenterBox(PictureBox picBox, Bitmap pic) { picBox.Image = pic; picBox.Location = new Point((picBox.Parent.ClientSize.Width / 2) - (pic.Width / 2), (picBox.Parent.ClientSize.Height / 2) - (pic.Height / 2)); picBox.Refresh(); }
Вот как рисуется и масштабируется графика:
private Stack<Line> lines = new Stack<Line>(); private void pictureBox1_MouseDown(object sender, MouseEventArgs e) //click in box { var mouseEventArgs2 = e as MouseEventArgs; if (e.Button == MouseButtons.Left) { lines.Push(new Line { Start = mouseEventArgs2.Location }); } } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (lines.Count > 0 && e.Button == System.Windows.Forms.MouseButtons.Left) { lines.Peek().End = e.Location; pictureBox1.Invalidate(); } } private void pictureBox1_Paint(object sender, PaintEventArgs e) { e.Graphics.ScaleTransform(zoom, zoom); foreach (var line in lines) { Pen magenta = new Pen(Color.Magenta, 2); e.Graphics.DrawLine(magenta, line.Start, line.End); } }
Что я уже пробовал:
Я попробовал пошевелить
e.Graphics.ScaleTransform(zoom, zoom);после цикла foreach.
Также попробовал удалить метод CenterBox.
Также попробовал использовать
e.Graphics.TranslateTransform()в сочетании с
e.Graphics.ScaleTransform()