C#控件picturebox實(shí)現(xiàn)圖像拖拽和縮放
本文實(shí)例為大家分享了C# picturebox實(shí)現(xiàn)圖像拖拽和縮放的具體代碼,供大家參考,具體內(nèi)容如下
1.核心步驟:
①新建Point類型全局變量mouseDownPoint,記錄拖拽過程中鼠標(biāo)位置;
②MouseDown事件記錄Cursor位置;
③MouseMove事件計(jì)算移動(dòng)矢量,并更新pictureBox1.Location。
代碼:
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouseDownPoint.X = Cursor.Position.X; //記錄鼠標(biāo)左鍵按下時(shí)位置 mouseDownPoint.Y = Cursor.Position.Y; isMove = true; pictureBox1.Focus(); //鼠標(biāo)滾輪事件(縮放時(shí))需要picturebox有焦點(diǎn) } } 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(); //鼠標(biāo)在picturebox上時(shí)才有焦點(diǎn),此時(shí)可以縮放 if (isMove) { int x, y; //新的pictureBox1.Location(x,y) int moveX, moveY; //X方向,Y方向移動(dòng)大小。 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; //記錄鼠標(biāo)左鍵按下時(shí)位置 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(); //鼠標(biāo)不在picturebox上時(shí)焦點(diǎn)給別的控件,此時(shí)無法縮放 if (isMove) { int x, y; //新的pictureBox1.Location(x,y) int moveX, moveY; //X方向,Y方向移動(dòng)大小。 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模式,根據(jù)圖像顯示大小更改picturebox大小,記錄鼠標(biāo)位置補(bǔ)償縮放位移,實(shí)現(xiàn)錨點(diǎn)縮放,即以鼠標(biāo)位置為中心進(jìn)行縮放。
zoomstep --- 自己定義滾輪滑動(dòng)縮放大小
代碼:
//實(shí)現(xiàn)錨點(diǎn)縮放(以鼠標(biāo)所指位置為中心縮放); //步驟: //①先改picturebox長寬,長寬改變量一樣; //②獲取縮放后picturebox中實(shí)際顯示圖像的長寬,這里長寬是不一樣的; //③將picturebox的長寬設(shè)置為顯示圖像的長寬; //④補(bǔ)償picturebox因縮放產(chǎn)生的位移,實(shí)現(xiàn)錨點(diǎn)縮放。 // 注釋:為啥要②③步?由于zoom模式的機(jī)制,把picturebox背景設(shè)為黑就知道為啥了。 //這里需要獲取zoom模式下picturebox所顯示圖像的大小信息,添加 using System.Reflection; //pictureBox1_MouseWheel事件沒找到。。。手動(dòng)添加,別忘在Form1.Designer.cs的“Windows 窗體設(shè)計(jì)器生成的代碼”里加入: //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; //因縮放產(chǎn)生的位移矢量 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) //縮小 { //防止一直縮成負(fù)值 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; } //第④步,求因縮放產(chǎn)生的位移,進(jìn)行補(bǔ)償,實(shí)現(xiàn)錨點(diǎn)縮放的效果 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); }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:C# WPF使用AForge類庫操作USB攝像頭拍照并保存
欄 目:C#教程
本文標(biāo)題:C#控件picturebox實(shí)現(xiàn)圖像拖拽和縮放
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5060.html
您可能感興趣的文章
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新聞效果的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實(shí)現(xiàn)多線程下載文件的方法
- 01-10C#實(shí)現(xiàn)Winform中打開網(wǎng)頁頁面的方法
- 01-10C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉計(jì)算機(jī)或重啟計(jì)算機(jī)的方法
- 01-10C#自定義簽名章實(shí)現(xiàn)方法
- 01-10C#文件斷點(diǎn)續(xù)傳實(shí)現(xiàn)方法
- 01-10winform實(shí)現(xiàn)創(chuàng)建最前端窗體的方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改