banboshi_V1/halftoneproject-master/Code/FrmPhotoShow.cs
2023-10-31 13:19:29 +08:00

217 lines
8.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Newtonsoft.Json.Linq;
using ProductionControl.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProductionControl
{
public partial class FrmPhotoShow : Form
{
List<Bitmap> lstBmp;
private int picIndex=0;
//
#region pic缩放变量
private double ratio = 1; // 图片的起始显示比例
private double ratioStep = 0.1;
private Size pic_size;
private int xPos;
private int yPos;
#endregion
public FrmPhotoShow(List<Bitmap> list)
{
InitializeComponent();
lstBmp = list;
//
//this.Width = Screen.PrimaryScreen.WorkingArea.Width / 2;
//this.Location = new Point(0, 0);
}
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Up || keyData == Keys.Down || keyData == Keys.Left || keyData == Keys.Right)
return false;
else
return base.ProcessDialogKey(keyData);
}
private void FrmPhotoShow_Load(object sender, EventArgs e)
{
}
private void FrmPhotoShow_Shown(object sender, EventArgs e)
{
this.reloadPic(lstBmp[picIndex]);
tslblPageNum.Text = $"第 {picIndex + 1}/{lstBmp.Count} 张";
tsbtnPre.Enabled = (picIndex > 0);
tsbtnNext.Enabled = (picIndex < lstBmp.Count - 1);
}
private void tsbtnPre_Click(object sender, EventArgs e)
{
if (picIndex <= 0) return;
reloadPic(lstBmp[--picIndex]);
tslblPageNum.Text = $"第 {picIndex + 1}/{lstBmp.Count} 张";
tsbtnPre.Enabled = (picIndex > 0);
tsbtnNext.Enabled = (picIndex < lstBmp.Count - 1);
}
private void tsbtnNext_Click(object sender, EventArgs e)
{
if (picIndex >=lstBmp.Count-1) return;
reloadPic(lstBmp[++picIndex]);
tslblPageNum.Text = $"第 {picIndex + 1}/{lstBmp.Count} 张";
tsbtnPre.Enabled = (picIndex > 0);
tsbtnNext.Enabled = (picIndex < lstBmp.Count - 1);
}
private void FrmPhoto_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Up:
case Keys.Left:
if (!this.tsbtnPre.Enabled) return;
tsbtnPre_Click(null, null);
break;
case Keys.Down:
case Keys.Right:
if (!this.tsbtnNext.Enabled) return;
tsbtnNext_Click(null, null);
break;
}
}
//----------
#region
private void reloadPic(Bitmap bmp)
{
var newSize = Util.getNewSize(this.ClientSize, new Size(bmp.Size.Width * 100, bmp.Size.Height * 100));
this.pnlPic.Size = newSize;
if (this.pnlPic.Width < this.ClientSize.Width)
this.pnlPic.Left = (this.ClientSize.Width - this.pnlPic.Width) / 2;
if (this.pnlPic.Height < this.ClientSize.Height)
this.pnlPic.Top = (this.ClientSize.Height - this.pnlPic.Height) / 2;
ratio = 1.0;// 图片的起始显示比例
Size size = bmp.Size;
//this.pnlPic.ClientSize = new Size(this.pnlPic.ClientSize.Width,
// (int)(this.pnlPic.ClientSize.Width * (size.Height * 1.0f / size.Width)));
this.pictureBox1.Size = this.pnlPic.ClientSize;
this.pictureBox1.Location = new Point(0, 0);
this.pictureBox1.Image = bmp;//del
pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
pictureBox1.MouseWheel += new MouseEventHandler(pictureBox1_MouseWheel);
pictureBox1.MouseMove += pictureBox1_MouseMove;
pictureBox1.MouseDown += pictureBox1_MouseDown;
this.ActiveControl = this.pictureBox1; // 设置焦点
pic_size = this.pnlPic.ClientSize;
}
private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
{
Point pictureBoxPoint = this.PointToClient(Cursor.Position);
//this.Text = $"{e.X}:{e.Y}; {pictureBoxPoint.X}:{pictureBoxPoint.Y}; {pictureBox1.Left}:{pictureBox1.Top}; " +
// $"{this.pictureBox1.Width}:{this.pictureBox1.Height}; {this.Width}:{this.Height}; " +
// $"Cursor:{Cursor.Position.X}:{Cursor.Position.Y}";
if (e.Delta > 0)
{
ratio += ratioStep;
if (ratio > 100) // 放大上限
ratio = 100;
else
{
int x = (int)(pictureBox1.Left - e.X * (e.X * 1.0d / pictureBox1.Width * ratioStep) + 0.5);
int y = (int)(pictureBox1.Top - e.Y * (e.Y * 1.0d / pictureBox1.Height * ratioStep) + 0.5);
//this.Text = $"{pictureBox1.Width}-{pic_size.Width};{ratio}{pictureBox1.Left}-{e.X}* 比例:{e.X*1.0d/pictureBox1.Width}={e.X}/{pictureBox1.Width} * {(ratioStep)}={x} | " +
// $"{pictureBox1.Top}-{e.Y}* {e.Y * 1.0f / pictureBox1.Height * (ratio - 1.0d)}={y}";
this.changePictureBoxSize(new Point(x, y), ratio);
}
}
else if (ratio - ratioStep >= 1)
{
ratio -= ratioStep;
//if (ratio < 0.1) // 放大下限
// ratio = 0.1;
//else
int x = (int)(pictureBox1.Left + e.X * (e.X * 1.0d / pictureBox1.Width * ratioStep) + 0.5);
int y = (int)(pictureBox1.Top + e.Y * (e.Y * 1.0d / pictureBox1.Height * ratioStep) + 0.5);
this.changePictureBoxSize(new Point(x, y), ratio);
}
}
private void changePictureBoxSize(Point location, double ratio)
{
var picSize = pictureBox1.Size;
picSize.Width = Convert.ToInt32(pic_size.Width * ratio);
picSize.Height = Convert.ToInt32(pic_size.Height * ratio);
pictureBox1.Size = picSize;
if (location.X > 0) location.X = 0;
if (location.Y > 0) location.Y = 0;
if (picSize.Width + location.X < this.pnlPic.ClientSize.Width) location.X = -(picSize.Width - this.pnlPic.ClientSize.Width);
if (picSize.Height + location.Y < this.pnlPic.ClientSize.Height) location.Y = -(picSize.Height - this.pnlPic.ClientSize.Height);
//Point location = new Point();
//location.X = (this.ClientSize.Width - this.pictureBox1.Width) / 2;
//location.Y = (this.ClientSize.Height - this.pictureBox1.Height) / 2;
this.pictureBox1.Location = location;
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
try
{
// 鼠标按下拖拽图片
if (e.Button == MouseButtons.Left)
{
//this.Text = $"{e.X}:{e.Y};{xPos}:{yPos}";
// 限制拖拽出框
if (pictureBox1.Width > this.pnlPic.ClientSize.Width
|| pictureBox1.Height > this.pnlPic.ClientSize.Height)
{
int moveX = e.X - xPos;
int moveY = e.Y - yPos;
if ((pictureBox1.Left + moveX) <= 0
&& (pictureBox1.Top + moveY) <= 0
&& (pictureBox1.Right + moveX) >= this.pnlPic.ClientSize.Width
&& (pictureBox1.Bottom + moveY) >= this.pnlPic.ClientSize.Height)
{
pictureBox1.Left += moveX;//设置x坐标.
pictureBox1.Top += moveY;//设置y坐标.
}
}
}
}
catch (Exception dd)
{
MessageBox.Show(dd.Message);
}
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
xPos = e.X;//当前x坐标.
yPos = e.Y;//当前y坐标.
}
#endregion
private void tsbtnClose_Click(object sender, EventArgs e)
{
this.Close();
}
}
}