You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

314 lines
8.7 KiB

#if NETFX || NETCORE
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace Apewer.Surface
{
/// <summary>
///
/// </summary>
public class BlockImageViewer : BaseControl
{
private PictureBox _picture = new PictureBox();
private Point _start = new Point(0, 0);
private Point _flow;
private int _padding = 0;
private bool _moving = false;
private bool _inimage = false;
/// <summary>
///
/// </summary>
public BlockImageViewer()
{
this.Controls.Add(_picture);
this.Dock = DockStyle.Fill;
this.BackColor = FormsUtility.GraceWall;
_picture.Location = new Point(0, 0);
_picture.Size = Size;
_picture.BackColor = FormsUtility.GraceWall;
Stretch = true;
_flow = new Point(this.Width - _picture.Left, this.Height - _picture.Top);
Adjust();
this.BackColorChanged += Event_This_BackColorChanged;
this.Resize += Event_Main_Resize;
this.MouseEnter += Event_This_MouseEnter;
MouseDown += Event_Picture_Down;
MouseMove += Event_Picture_Move;
MouseUp += Event_Picture_Up;
MouseWheel += Event_Main_Wheel;
_picture.MouseDown += Event_Picture_Down;
_picture.MouseMove += Event_Picture_Move;
_picture.MouseUp += Event_Picture_Up;
_picture.MouseWheel += Event_Picture_Wheel;
_picture.MouseHover += Event_Picture_Hover;
_picture.MouseLeave += Event_Picture_Leave;
}
private void Event_This_MouseEnter(object sender, EventArgs e)
{
if (this.IsHandleCreated) this.Focus();
}
private void Event_This_BackColorChanged(object sender, EventArgs e)
{
_picture.BackColor = this.BackColor;
}
private void Event_Picture_Hover(object sender, EventArgs e)
{
_inimage = true;
}
private void Event_Picture_Leave(object sender, EventArgs e)
{
_inimage = false;
}
private void Event_Main_Wheel(object sender, MouseEventArgs e)
{
if (!_inimage)
{
int vp = BodyPadding;
int vw, vh, vl, vt;
vl = _picture.Width / 2 + _picture.Left;
vt = _picture.Height / 2 + _picture.Top;
if (e.Delta > 0)
{
vw = (int)(_picture.Width * 1.2);
vh = (int)(_picture.Height * 1.2);
if (vw > (this.Width * 10))
{
vw = this.Width * 10;
vh = this.Height * 10;
}
}
else
{
vw = (int)(_picture.Width * 0.8);
vh = (int)(_picture.Height * 0.8);
if (vw < (this.Width * 0.5))
{
vw = (int)(this.Width * 0.5);
vh = (int)(this.Height * 0.5);
}
}
_picture.Size = new Size(vw, vh);
_picture.Left = (int)(vl - _picture.Width / 2);
_picture.Top = (int)(vt - _picture.Height / 2);
}
}
private void Event_Picture_Wheel(object sender, MouseEventArgs e)
{
int vp = BodyPadding;
int vw, vh, vl, vt;
double vx, vy;
vx = (double)e.X / (double)_picture.Width;
vy = (double)e.Y / (double)_picture.Height;
vl = e.X + _picture.Left;
vt = e.Y + _picture.Top;
if (e.Delta > 0)
{
vw = (int)(_picture.Width * 1.2);
vh = (int)(_picture.Height * 1.2);
if (vw > (this.Width * 10))
{
vw = this.Width * 10;
vh = this.Height * 10;
}
}
else
{
vw = (int)(_picture.Width * 0.8);
vh = (int)(_picture.Height * 0.8);
if (vw < (this.Width * 0.5))
{
vw = (int)(this.Width * 0.5);
vh = (int)(this.Height * 0.5);
}
}
_picture.Size = new Size(vw, vh);
_picture.Left = (int)(vl - _picture.Width * vx);
_picture.Top = (int)(vt - _picture.Height * vy);
}
private void Event_Picture_Down(object sender, MouseEventArgs e)
{
switch (e.Button)
{
case MouseButtons.Left:
_start.X = Cursor.Position.X - _picture.Left;
_start.Y = Cursor.Position.Y - _picture.Top;
_moving = true; break;
case MouseButtons.Right:
_moving = false;
Adjust();
break;
}
}
private void Event_Picture_Move(object sender, MouseEventArgs e)
{
if (_moving)
{
_picture.Left = Cursor.Position.X - _start.X;
_picture.Top = Cursor.Position.Y - _start.Y;
}
}
private void Event_Picture_Up(object sender, MouseEventArgs e)
{
switch (e.Button)
{
case MouseButtons.Left:
_moving = false;
break;
}
}
private void Event_Main_Resize(object sender, EventArgs e) { Adjust(); }
/// <summary>
///
/// </summary>
public void Adjust()
{
int vp = BodyPadding;
_picture.Width = this.Width - vp * 2;
_picture.Height = this.Height - vp * 2;
_picture.Location = new Point(vp, vp);
}
/// <summary>
///
/// </summary>
public int BodyPadding
{
get
{
int vw = this.Width / 2 - 2;
int vh = this.Height / 2 - 2;
int vm = (vw > vh) ? vh : vw;
return (_padding > vm) ? vm : _padding;
}
set
{
if (value >= 0) _padding = value;
}
}
/// <summary>
///
/// </summary>
public Image GetImage()
{
return _picture.BackgroundImage;
}
/// <summary>
///
/// </summary>
public void LoadImage(byte[] image)
{
Clear();
if (image.Length < 1) return;
if (!this.IsHandleCreated) return;
if (!_picture.IsHandleCreated) return;
Invoke(new Invoker(delegate ()
{
var memory = new MemoryStream(image);
var bitmap = new Bitmap(memory);
_picture.BackgroundImage = bitmap;
}));
}
/// <summary>
///
/// </summary>
public void LoadImage(Image image)
{
Clear();
_picture.BackgroundImage = image;
}
/// <summary></summary>
public void LoadImage(string path)
{
if (File.Exists(path))
{
try
{
var vdata = File.ReadAllBytes(path);
LoadImage(vdata);
}
catch { Clear(); }
}
else { Clear(); }
}
/// <summary>
///
/// </summary>
public void Clear()
{
if (_picture.BackgroundImage != null) _picture.BackgroundImage.Dispose();
_picture.BackgroundImage = null;
}
/// <summary>
///
/// </summary>
public void Clean()
{
Clear();
}
/// <summary>
///
/// </summary>
public bool Stretch
{
get
{
return (_picture.BackgroundImageLayout == ImageLayout.Stretch) ? true : false;
}
set
{
if (value) _picture.BackgroundImageLayout = ImageLayout.Stretch;
else _picture.BackgroundImageLayout = ImageLayout.Zoom;
}
}
/// <summary>
///
/// </summary>
public Size ImageSize
{
get
{
if (_picture.BackgroundImage != null) return _picture.BackgroundImage.Size;
else return new Size(0, 0);
}
}
}
}
#endif