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)
- {
- }
- }
- }
|