381 lines
13 KiB
C#
381 lines
13 KiB
C#
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);
|
|
}
|
|
|
|
}
|
|
}
|