using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace pbox_zoom_control { public partial class pbox_zoom: UserControl { public event EventHandler Click2; public event MouseEventHandler Mouse_Move_pic; public event EventHandler Mouse_Hover_pic; public event EventHandler Mouse_Enter_pic; public event EventHandler Mouse_Leave_pic; private string path = ""; private void HandleClick2(object sender, EventArgs e) { // we'll explain this in a minute this.OnClick2(EventArgs.Empty); } protected virtual void OnClick2(EventArgs e) { this.Click2?.Invoke(this, e); } private void HandleMouse_Move_pic(object sender, MouseEventArgs e) { // we'll explain this in a minute this.OnMouse_Move_pic(e); } private void OnMouse_Move_pic(MouseEventArgs e) { this.Mouse_Move_pic?.Invoke(this, e); } private void HandleMouse_Hover_pic(object sender, EventArgs e) { // we'll explain this in a minute this.OnMouse_Hover_pic(EventArgs.Empty); } protected virtual void OnMouse_Hover_pic(EventArgs e) { this.Mouse_Hover_pic?.Invoke(this, e); } private void HandleMouse_Enter_pic(object sender, EventArgs e) { // we'll explain this in a minute this.OnMouse_Enter_pic(EventArgs.Empty); } protected virtual void OnMouse_Enter_pic(EventArgs e) { this.Mouse_Enter_pic?.Invoke(this, e); } private void HandleMouse_Leave_pic(object sender, EventArgs e) { // we'll explain this in a minute this.OnMouse_Leave_pic(EventArgs.Empty); } protected virtual void OnMouse_Leave_pic(EventArgs e) { this.Mouse_Leave_pic?.Invoke(this, e); } private double ZOOMFACTOR = 1.25; // = 25% smaller or larger private int MINMAX = 10; // 5 times bigger or smaller than the ctrl private Bitmap bild; private int mouse_x = 0; private int mouse_y = 0; public pbox_zoom() { InitializeComponent(); InitCtrl(); } private void InitCtrl() { panel1.Cursor = System.Windows.Forms.Cursors.NoMove2D; panel1.MouseEnter += new EventHandler(pbox_1_MouseEnter); pbox_1.MouseEnter += new EventHandler(pbox_1_MouseEnter); panel1.MouseWheel += new MouseEventHandler(pbox_1_MouseWheel); pbox_1.Click += HandleClick2; pbox_1.MouseMove += HandleMouse_Move_pic; pbox_1.MouseHover += HandleMouse_Hover_pic; pbox_1.MouseEnter += HandleMouse_Enter_pic; pbox_1.MouseLeave += HandleMouse_Leave_pic; } public Bitmap Image { get { return bild; } set { open_picture(value); } } public double zoomfactor { get { return ZOOMFACTOR; } set { ZOOMFACTOR = value; } } public int minmax { get { return MINMAX; } set { MINMAX = value; } } public string ImageLocation { get { return path; } set { if(value != "" && value != null) open_picture(value); } } public Point Mouse_Position { get { return new Point(mouse_x,mouse_y); } } public int Mouse_X { get { return mouse_x; } } public int Mouse_Y { get { return mouse_y; } } public void open_picture(string pic_path) { bool save_position = false; Point position = new Point(); Size size = new Size(); Size old_size = new Size(); if (pbox_1.Image != null) old_size = pbox_1.Image.Size; int v = 0; int h = 0; if (bild != null) bild.Dispose(); bild = new Bitmap(pic_path); path = pic_path; if(bild != null && pbox_1.Image != null) if (bild.Size == old_size) save_position = true; if (save_position) { position = pbox_1.Location; size = pbox_1.Size; v = VerticalScroll.Value; h = HorizontalScroll.Value; } pbox_1.Image = bild; if (((double)bild.Width / (double)bild.Height) > ((double)panel1.Width / (double)panel1.Height)) { pbox_1.Width = panel1.Width; pbox_1.Height = pbox_1.Width * bild.Height / bild.Width; } else { pbox_1.Height = panel1.Height; pbox_1.Width = pbox_1.Height * bild.Width / bild.Height; } if (save_position) { pbox_1.Location = position; pbox_1.Size = size; VerticalScroll.Value = v; HorizontalScroll.Value = h; } else { update_scrollbar(); update_picture_position(); } } public void open_picture(Bitmap Image) { bool save_position = false; Point position = new Point(); Size size = new Size(); Size old_size = new Size(); if (pbox_1.Image != null) old_size = pbox_1.Image.Size; int v = 0; int h = 0; path = ""; if (bild != null) bild.Dispose(); bild = new Bitmap(Image); if (bild != null && pbox_1.Image != null) if (bild.Size == old_size) save_position = true; if (save_position) { position = pbox_1.Location; size = pbox_1.Size; v = VerticalScroll.Value; h = HorizontalScroll.Value; } pbox_1.Image = bild; if (((double)bild.Width / (double)bild.Height) > ((double)panel1.Width / (double)panel1.Height)) { pbox_1.Width = panel1.Width; pbox_1.Height = pbox_1.Width * bild.Height / bild.Width; } else { pbox_1.Height = panel1.Height; pbox_1.Width = pbox_1.Height * bild.Width / bild.Height; } if (save_position) { pbox_1.Location = position; pbox_1.Size = size; VerticalScroll.Value = v; HorizontalScroll.Value = h; } else { update_scrollbar(); update_picture_position(); } } private void ZoomIn() { if ((pbox_1.Width < (MINMAX * panel1.Width)) && (pbox_1.Height < (MINMAX * panel1.Height))) { pbox_1.Width = Convert.ToInt32(pbox_1.Width * ZOOMFACTOR); pbox_1.Height = Convert.ToInt32(pbox_1.Height * ZOOMFACTOR); pbox_1.SizeMode = PictureBoxSizeMode.StretchImage; } } private void ZoomOut() { if ((pbox_1.Width > (panel1.Width / MINMAX)) && (pbox_1.Height > (panel1.Height / MINMAX))) { pbox_1.SizeMode = PictureBoxSizeMode.StretchImage; pbox_1.Width = Convert.ToInt32(pbox_1.Width / ZOOMFACTOR); pbox_1.Height = Convert.ToInt32(pbox_1.Height / ZOOMFACTOR); } } private void pbox_1_MouseEnter(object sender, EventArgs e) { if (pbox_1.Focused == false) { pbox_1.Focus(); update_picture_position(); } } private void pbox_1_MouseWheel(object sender, MouseEventArgs e) { Point old_position = pbox_1.Location; Size old_size_picture = pbox_1.Size; Size old_size_frame = panel1.Size; if (e.Delta > 0) { ZoomIn(); } else { ZoomOut(); } Size new_size_picture = pbox_1.Size; Size new_size_frame = panel1.Size; //pbox_1.Location = new_picture_position(old_position, old_size_picture, old_size_frame, new_size_picture, new_size_frame); Point mouse = e.Location; pbox_1.Location = new_picture_position(old_position, old_size_picture, mouse, new_size_picture, mouse); update_scrollbar(); update_picture_position(); } Point new_picture_position(Point old_position, Size old_size_picture, Size old_size_frame, Size new_size_picture, Size new_size_frame) { Point old_position_center = new Point(old_size_frame.Width / 2 - old_position.X, old_size_frame.Height / 2 - old_position.Y); Point new_position_center = new Point(old_position_center.X * new_size_picture.Width / old_size_picture.Width, old_position_center.Y * new_size_picture.Height / old_size_picture.Height); Point new_pos = new Point(new_size_frame.Width / 2 - new_position_center.X, new_size_frame.Height / 2 - new_position_center.Y); return new_pos; } Point new_picture_position(Point old_position, Size old_size_picture, Point old_position_curser, Size new_size_picture, Point new_position_curser) { Point old_position_center = new Point(old_position_curser.X - old_position.X, old_position_curser.Y - old_position.Y); Point new_position_center = new Point(old_position_center.X * new_size_picture.Width / old_size_picture.Width, old_position_center.Y * new_size_picture.Height / old_size_picture.Height); Point new_pos = new Point(new_position_curser.X - new_position_center.X, new_position_curser.Y - new_position_center.Y); return new_pos; } private void pbox_1_SizeChanged(object sender, EventArgs e) { update_scrollbar(); update_picture_position(); } private void Form1_SizeChanged(object sender, EventArgs e) { update_scrollbar(); update_picture_position(); } void update_scrollbar() { int max_x = pbox_1.Width - panel1.Width; int max_y = pbox_1.Height - panel1.Height; if (0 < max_x) { hScrollBar1.Enabled = true; hScrollBar1.Maximum = max_x; hScrollBar1.Value = Math.Max(0, Math.Min(max_x, -pbox_1.Location.X)); } else { hScrollBar1.Enabled = false; } if (0 < max_y) { vScrollBar1.Enabled = true; vScrollBar1.Maximum = max_y; vScrollBar1.Value = Math.Max(0, Math.Min(max_y, -pbox_1.Location.Y)); } else { vScrollBar1.Enabled = false; } } private void vScrollBar1_Scroll(object sender, ScrollEventArgs e) { update_picture_position(); } private void hScrollBar1_Scroll(object sender, ScrollEventArgs e) { update_picture_position(); } void update_picture_position() { int x = -hScrollBar1.Value; int y = -vScrollBar1.Value; if (pbox_1.Size.Width < panel1.Width) x = (panel1.Width - pbox_1.Width) / 2; if (pbox_1.Size.Height < panel1.Height) y = (panel1.Height - pbox_1.Height) / 2; pbox_1.Location = new Point(x, y); } private void pbox_1_MouseMove(object sender, MouseEventArgs e) { mouse_x = bild.Width * e.Location.X / pbox_1.Width; mouse_y = bild.Height * e.Location.Y / pbox_1.Height; } private void pbox_zoom_Load(object sender, EventArgs e) { bild = new Bitmap(10, 10); } } }