banboshi_V1/halftoneproject-master/Code/UIExtend/pbox_zoom.cs

381 lines
13 KiB
C#
Raw Normal View History

2023-10-31 13:19:29 +08:00
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);
}
}
}