| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 | using System;using System.Drawing;using System.Windows.Forms;namespace PaintDotNet.CustomControl{    //internal sealed class    public partial class PicturePreviewAdjustControl : BaseUserControl// Control//    {        System.Drawing.Point mouseDownPoint;//存储鼠标焦点的全局变量        bool isSelected = false;        public bool isShown = false;        /// <summary>        /// 是否使用原图取色        /// </summary>        private bool item3Checked;        /// <summary>        /// 原图取色-鼠标点击事件        /// </summary>        public event MouseEventHandler item3MouseDown;        private void InitializeLanguageText()        {            this.box_Picture.Text = PdnResources.GetString("Menu.Preview.text");        }        /// <summary>        /// 图像处理的预览Control        /// 包括放大、缩小、选择、移动        /// </summary>        public PicturePreviewAdjustControl()        {            InitializeComponent();            if (!DesignMode)            {                InitializeLanguageText();                this.ZoomInButton.Image = PdnResources.GetImageResource("Icons.MenuViewZoomInIcon.png").Reference;                this.ZoomOutButton.Image = PdnResources.GetImageResource("Icons.MenuViewZoomOutIcon.png").Reference;                this.MoveSelectionButton.Image = PdnResources.GetImageResource("Icons.MoveSelectionToolIcon.png").Reference;                this.PanButton.Image = PdnResources.GetImageResource("Icons.PanToolIcon.png").Reference;            }        }        //放大        private void ZoomInButton_Click(object sender, EventArgs e)        {            Do.TryBool(ZoomInImpl);        }        //放大        private void ZoomInImpl()        {            //int pictureBox1CenterX = pictureBox1.Location.X + pictureBox1.Width / 2;            //int pictureBox1CenterY = pictureBox1.Location.Y + pictureBox1.Height / 2;            double eDelta = pictureBox1.Height * 0.25;            double scale = 1;            if (pictureBox1.Height > 0)            {                scale = (double)pictureBox1.Width / (double)pictureBox1.Height;            }            pictureBox1.Width += (int)(eDelta * scale * 2);            pictureBox1.Height += (int)(eDelta * 2);            pictureBox1.Left -= (int)(eDelta * scale * 1);            pictureBox1.Top -= (int)(eDelta * 1);        }        //缩小        private void ZoomOutButton_Click(object sender, EventArgs e)        {            double eDelta = pictureBox1.Height * 0.16;// 0.25;            double scale = 1;            if (pictureBox1.Height > 0)            {                scale = (double)pictureBox1.Width / (double)pictureBox1.Height;            }            pictureBox1.Width -= (int)(eDelta * scale * 2);            pictureBox1.Height -= (int)(eDelta * 2);            pictureBox1.Left += (int)(eDelta * scale * 1);            pictureBox1.Top += (int)(eDelta * 1);        }        //选择        private void MoveSelectionButton_Click(object sender, EventArgs e)        {            if (this.item3Checked)            {                pictureBox1.Cursor = Cursors.Cross;            }            else            {                pictureBox1.Cursor = Cursors.Default;            }        }        //移动        private void PanButton_Click(object sender, EventArgs e)        {            pictureBox1.Cursor = new Cursor(PdnResources.GetResourceStream("Cursors.PanToolCursor.cur"));             //Cursors.Hand;        }        private void pictureBox1_Click(object sender, EventArgs e)        {        }        private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)        {            double scale = 1;            if (pictureBox1.Height > 0)            {                scale = (double)pictureBox1.Width / (double)pictureBox1.Height;            }            if (pictureBox1.Width + (int)(e.Delta * scale) > 0 && pictureBox1.Height + e.Delta > 0)            {                pictureBox1.Width += (int)(e.Delta * scale);                pictureBox1.Height += e.Delta;                pictureBox1.Left -= (int)(e.Delta * scale * 0.5);                pictureBox1.Top -= (int)(e.Delta * 0.5);            }        }        //在MouseDown处获知鼠标是否按下,并记录下此时的鼠标坐标值;        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)        {            if (e.Button == MouseButtons.Left && pictureBox1.Cursor == Cursors.Hand)            {                mouseDownPoint.X = Cursor.Position.X;  //注:全局变量mouseDownPoint前面已定义为Point类型                  mouseDownPoint.Y = Cursor.Position.Y;                isSelected = true;            }            else if (this.item3Checked && e.Button == MouseButtons.Left && pictureBox1.Cursor == Cursors.Cross)            {                //获取当前位置坐标                Rectangle rc = this.pictureBox1.ClientRectangle;                int width = (int)this.pictureBox1.Width;// (this.compositionSurface.Width * this.scaleFactor.Ratio);                int height = (int)this.pictureBox1.Height;// (this.compositionSurface.Height * this.scaleFactor.Ratio);                int x = 0;                int y = 0;                double radio = 1;                //垂直方向有空白                if ((this.pictureBox1.Image.Width / (double)this.pictureBox1.Width) > (this.pictureBox1.Image.Height / (double)this.pictureBox1.Height))                {                    y = (int)((height - width * this.pictureBox1.Image.Height / (double)this.pictureBox1.Image.Width) / 2.0);                    radio = this.pictureBox1.Image.Width / (double)this.pictureBox1.Width;                }                else if ((this.pictureBox1.Image.Width / (double)this.pictureBox1.Width) < (this.pictureBox1.Image.Height / (double)this.pictureBox1.Height))                {                    x = (int)((width - height * this.pictureBox1.Image.Width / (double)this.pictureBox1.Image.Height) / 2.0);                    radio = this.pictureBox1.Image.Height / (double)this.pictureBox1.Height;                }                //int x = (rc.Width < width) ? this.pictureBox1.Location.X/*this.panel.AutoScrollPosition.X + offsetHalfW*/ : (rc.Width - width) / 2;                //int y = (rc.Height < height) ? this.pictureBox1.Location.Y/*this.panel.AutoScrollPosition.Y + offsetHalfH*/ : (rc.Height - height) / 2;                Point point = e.Location;                point.X -= x;                point.Y -= y;                Point newPoint = new Point((int)((long)point.X * radio), (int)((long)point.Y * radio));                this.item3MouseDown?.Invoke(sender, new MouseEventArgs(e.Button, e.Clicks, newPoint.X, newPoint.Y, e.Delta));            }        }        public void selectColorMode(bool selectColor)        {            this.item3Checked = selectColor;            if (selectColor)            {                pictureBox1.Cursor = Cursors.Cross;                this.MoveSelectionButton.Focus();            }            else            {                pictureBox1.Cursor = Cursors.Default;            }        }        //在MouseUp处获知鼠标是否松开,终止拖动操作;        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)        {            isSelected = false;        }        private bool IsMouseInPanel()        {            if (this.panel_Picture.Left + this.box_Picture.Left < PointToClient(Cursor.Position).X                    && PointToClient(Cursor.Position).X < this.panel_Picture.Left + this.box_Picture.Left                    + this.panel_Picture.Width && this.panel_Picture.Top + this.box_Picture.Top                    < PointToClient(Cursor.Position).Y && PointToClient(Cursor.Position).Y                    < this.panel_Picture.Top + this.box_Picture.Top + this.panel_Picture.Height)            {                return true;            }            else            {                return false;            }        }        //图片平移,在MouseMove处添加拖动函数操作        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)        {            if (isSelected && IsMouseInPanel())//确定已经激发MouseDown事件,和鼠标在picturebox的范围内            {                this.pictureBox1.Left = this.pictureBox1.Left + (Cursor.Position.X - mouseDownPoint.X);                this.pictureBox1.Top = this.pictureBox1.Top + (Cursor.Position.Y - mouseDownPoint.Y);                mouseDownPoint.X = Cursor.Position.X;                mouseDownPoint.Y = Cursor.Position.Y;            }        }        private void picturePreviewAdjustControl_Resize(object sender, EventArgs e)        {            if (isShown)            {                this.pictureBox1.Left = 0;                this.pictureBox1.Top = 0;                this.pictureBox1.Width = panel_Picture.Width;                this.pictureBox1.Height = panel_Picture.Height;            }        }        private void box_Picture_Enter(object sender, EventArgs e)        {        }    }}
 |