using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ProductionControl.UIExtend
{
    public partial class UCImageView : UserControl
    {
        private double ratioStep = 0.1;
        public UCImageView()
        {
            InitializeComponent();
            pictureBox1.Location = new Point(0, 0); 
        }
        #region private tool
        /// <summary>
        /// 获取适合大小
        /// </summary>
        /// <param name="sourceSize"></param>
        /// <param name="targetSize"></param>
        /// <returns></returns>
        private Size getNewSize(Size sourceSize, Size targetSize)
        {
            if (sourceSize.Width <= targetSize.Width && sourceSize.Height <= targetSize.Height)
                return sourceSize;

            int num = sourceSize.Width / targetSize.Width;
            int num2 = sourceSize.Height / targetSize.Height;
            int num3 = (num < num2) ? num2 : num;
            return new Size(sourceSize.Width / num3, sourceSize.Height / num3);
        }
        /// <summary>
        /// 等比计算宽高
        /// </summary>
        /// <param name="sourceSize"></param>
        /// <param name="targetSize"></param>
        /// <returns></returns>
        private SizeF getNewSize(SizeF sourceSize, SizeF targetSize)
        {
            if (sourceSize.Width <= targetSize.Width && sourceSize.Height <= targetSize.Height)
                return sourceSize;

            float num = sourceSize.Width / targetSize.Width;
            float num2 = sourceSize.Height / targetSize.Height;
            float num3 = (num < num2) ? num2 : num;
            return new SizeF(sourceSize.Width / num3, sourceSize.Height / num3);
        }

        #endregion
        public void loadImage(Image img)
        {
            //var newSize = getNewSize(ClientSize, new Size(img.Size.Width * 100, img.Size.Height * 100));
            //pnlPic.Size = newSize;
            //if (pnlPic.Width < ClientSize.Width)
            //    pnlPic.Left = (ClientSize.Width - pnlPic.Width) / 2;
            //if (pnlPic.Height < ClientSize.Height)
            //    pnlPic.Top = (ClientSize.Height - pnlPic.Height) / 2;
             
            pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
            pictureBox1.MouseWheel += new MouseEventHandler(pictureBox1_MouseWheel);
            pictureBox1.MouseMove += pictureBox1_MouseMove;
            pictureBox1.MouseDown += pictureBox1_MouseDown;

            //pnlPic.ClientSize = new Size(pnlPic.ClientSize.Width,
            //    (int)(pnlPic.ClientSize.Width * (size.Height * 1.0f / size.Width)));
            pictureBox1.Size = ClientSize;
            pictureBox1.Location = new Point(0, 0);
            pictureBox1.Image = img;//del
            ActiveControl = pictureBox1; // 设置焦点   
        }
        private void UCImageView_Load(object sender, EventArgs e)
        {

        }

        private void checkBorderLine()
        {
            if (pictureBox1.Width < ClientSize.Width) pictureBox1.Width = ClientSize.Width;
            if (pictureBox1.Height < ClientSize.Height) pictureBox1.Height = ClientSize.Height;

            if (pictureBox1.Right < ClientSize.Width) pictureBox1.Left += ClientSize.Width - pictureBox1.Right;
            if (pictureBox1.Bottom < ClientSize.Height) pictureBox1.Top += ClientSize.Height - pictureBox1.Bottom;
            if (pictureBox1.Left > 0) pictureBox1.Left = 0;
            if (pictureBox1.Top > 0) pictureBox1.Top = 0; 
         }
        public void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
        {
            int x = e.Location.X;
            int y = e.Location.Y;
            double oldW = pictureBox1.Width;
            double oldH = pictureBox1.Height;
            int width,height;
            double ratio;
            if (e.Delta > 0) //放大
            {
                ratio = 1 + ratioStep;
                width = Convert.ToInt32(pictureBox1.Width * ratio);
                height = Convert.ToInt32(pictureBox1.Height * ratio);
                //if (width * height > 45800000)
                //    return;
                if (width / ClientSize.Width > 10)
                    return;

                pictureBox1.Width = width;
                pictureBox1.Height = height;
            }
            if (e.Delta < 0) //缩小
            {
                //防止一直缩成负值
                if (pictureBox1.Width < this.Width || pictureBox1.Height < this.Height)
                    return;
                ratio = 1.0 - ratioStep;
                width = (int)(pictureBox1.Width * ratio);
                height= (int)(pictureBox1.Height * ratio);
                pictureBox1.Width = width;
                pictureBox1.Height = height;
            }
            this.Text = $"{e.X},{e.Y}";
            //求因缩放产生的位移，进行补偿，实现锚点缩放的效果 
            int VX = (int)((oldW - pictureBox1.Width) / oldW * x);
            int VY = (int)((oldH - pictureBox1.Height) / oldH * y);
            pictureBox1.Location = new Point(pictureBox1.Location.X + VX, pictureBox1.Location.Y + VY);
            checkBorderLine();
        }

        //移动
        private int xPos;
        private int yPos;
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            try
            {
                // 鼠标按下拖拽图片
                if (e.Button == MouseButtons.Left)
                {
                    this.Parent.Text = $"{e.X}:{e.Y};{xPos}:{yPos}";
                    // 限制拖拽出框
                    if (pictureBox1.Width > ClientSize.Width
                        || pictureBox1.Height > ClientSize.Height)
                    {
                        int moveX = e.X - xPos;
                        int moveY = e.Y - yPos;
                        if ((pictureBox1.Left + moveX) <= 0
                            && (pictureBox1.Top + moveY) <= 0
                            && (pictureBox1.Right + moveX) >= ClientSize.Width
                            && (pictureBox1.Bottom + moveY) >= ClientSize.Height)
                        {
                            pictureBox1.Left += moveX;//设置x坐标.
                            pictureBox1.Top += moveY;//设置y坐标. 
                            checkBorderLine();
                        }
                    }
                }
            }
            catch (Exception dd)
            {
                MessageBox.Show(dd.Message);
            }
        }
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            xPos = e.X;//当前x坐标.
            yPos = e.Y;//当前y坐标.
        }

        private void UCImageView_ClientSizeChanged(object sender, EventArgs e)
        {
            checkBorderLine();
        }
    }
}
