c# picturebox 图像拖拽和缩放
生活随笔
收集整理的這篇文章主要介紹了
c# picturebox 图像拖拽和缩放
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
核心步驟:
①新建Point類型全局變量mouseDownPoint,記錄拖拽過程中鼠標位置;
②MouseDown事件記錄Cursor位置;
③MouseMove事件計算移動矢量,并更新pictureBox1.Location。
代碼: private void pictureBox1_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){mouseDownPoint.X = Cursor.Position.X; //記錄鼠標左鍵按下時位置mouseDownPoint.Y = Cursor.Position.Y; isMove = true;pictureBox1.Focus(); //鼠標滾輪事件(縮放時)需要picturebox有焦點 }}private void pictureBox1_MouseUp(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){isMove = false; }}private void pictureBox1_MouseMove(object sender, MouseEventArgs e){pictureBox1.Focus(); //鼠標在picturebox上時才有焦點,此時可以縮放if (isMove){int x, y; //新的pictureBox1.Location(x,y)int moveX, moveY; //X方向,Y方向移動大小。moveX = Cursor.Position.X - mouseDownPoint.X;moveY = Cursor.Position.Y - mouseDownPoint.Y;x = pictureBox1.Location.X + moveX;y = pictureBox1.Location.Y + moveY; pictureBox1.Location = new Point(x, y);mouseDownPoint.X = Cursor.Position.X;mouseDownPoint.Y = Cursor.Position.Y; }}private void panel2_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){mouseDownPoint.X = Cursor.Position.X; //記錄鼠標左鍵按下時位置mouseDownPoint.Y = Cursor.Position.Y;isMove = true;}}private void panel2_MouseUp(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){isMove = false;}}private void panel2_MouseMove(object sender, MouseEventArgs e){panel2.Focus(); //鼠標不在picturebox上時焦點給別的控件,此時無法縮放 if (isMove){int x, y; //新的pictureBox1.Location(x,y)int moveX, moveY; //X方向,Y方向移動大小。moveX = Cursor.Position.X - mouseDownPoint.X;moveY = Cursor.Position.Y - mouseDownPoint.Y;x = pictureBox1.Location.X + moveX;y = pictureBox1.Location.Y + moveY;pictureBox1.Location = new Point(x, y);mouseDownPoint.X = Cursor.Position.X;mouseDownPoint.Y = Cursor.Position.Y;}}2.圖像縮放核心思想:利用picturebox的zoom模式,根據圖像顯示大小更改picturebox大小,記錄鼠標位置補償縮放位移,實現錨點縮放,即以鼠標位置為中心進行縮放。zoomstep --- 自己定義滾輪滑動縮放大小
代碼://實現錨點縮放(以鼠標所指位置為中心縮放);//步驟://①先改picturebox長寬,長寬改變量一樣;//②獲取縮放后picturebox中實際顯示圖像的長寬,這里長寬是不一樣的;//③將picturebox的長寬設置為顯示圖像的長寬;//④補償picturebox因縮放產生的位移,實現錨點縮放。// 注釋:為啥要②③步?由于zoom模式的機制,把picturebox背景設為黑就知道為啥了。//這里需要獲取zoom模式下picturebox所顯示圖像的大小信息,添加 using System.Reflection;//pictureBox1_MouseWheel事件沒找到。。。手動添加,別忘在Form1.Designer.cs的“Windows 窗體設計器生成的代碼”里加入: //this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseWheel)。private void pictureBox1_MouseWheel(object sender, MouseEventArgs e){int x = e.Location.X;int y = e.Location.Y;int ow = pictureBox1.Width;int oh = pictureBox1.Height; int VX, VY; //因縮放產生的位移矢量if (e.Delta > 0) //放大 {//第①步pictureBox1.Width += zoomStep; pictureBox1.Height += zoomStep;//第②步PropertyInfo pInfo = pictureBox1.GetType().GetProperty("ImageRectangle", BindingFlags.Instance |BindingFlags.NonPublic);Rectangle rect = (Rectangle)pInfo.GetValue(pictureBox1, null);//第③步pictureBox1.Width = rect.Width;pictureBox1.Height = rect.Height;}if (e.Delta < 0) //縮小 {//防止一直縮成負值if (pictureBox1.Width < myBmp.Width / 10)return;pictureBox1.Width -= zoomStep;pictureBox1.Height -= zoomStep;PropertyInfo pInfo = pictureBox1.GetType().GetProperty("ImageRectangle", BindingFlags.Instance |BindingFlags.NonPublic);Rectangle rect = (Rectangle)pInfo.GetValue(pictureBox1, null);pictureBox1.Width = rect.Width;pictureBox1.Height = rect.Height;}//第④步,求因縮放產生的位移,進行補償,實現錨點縮放的效果VX = (int)((double)x * (ow - pictureBox1.Width) / ow);VY = (int)((double)y * (oh - pictureBox1.Height) / oh);pictureBox1.Location = new Point(pictureBox1.Location.X + VX, pictureBox1.Location.Y + VY);}總結
以上是生活随笔為你收集整理的c# picturebox 图像拖拽和缩放的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python Numpy库教程
- 下一篇: interlace和progressiv