對於一個圖片查看器來說,鼠標拖動和滾動縮放也就是說可以鼠標在程序界面上拖動圖片,通過鼠標滾輪放大和縮小圖片。這兩種功能在圖片瀏覽程序里面再普通不過了。那怎么用C#來進行實現。
通過操作你也知道,縮放的時候,我們首先第一個動作就是按下鼠標左鍵,也就是MouseDown;然后移動鼠標,將圖片拖動到你想要的位置, 也就是MouseMove;最后釋放鼠標,完成拖動操作,即MouseUp。通過這個分析,我們已經知道了, 如果要實現這個拖動的功能,那就得監聽鼠標的這三個事件,即MouseDown、MouseMove和MouseUp。
當MouseDown事件發生的時候, 我們首先要做的是判斷是不是左單擊即
if (e.Button == MouseButtons.Left)
然后將此時的鼠標的移動前位置記錄記錄下來並將標識器至true(我要移動了),事件完整的代碼如下:
private void picBox_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouseDownPoint.X = Cursor.Position.X; //注:全局變量mouseDownPoint前面已定義為Point類型 mouseDownPoint.Y = Cursor.Position.Y; isSelected = true; } }
好了,現在我們已經完成了MouseDown事件的實現
接下來將是移動--MouseMove
拖動的原理我們應該也知道,就是改變PictureBox的left和top屬性來實現PictureBox的移動,left和top的增減就是鼠標移動的距離。即
this.picBox.Left = this.picBox.Left + (Cursor.Position.X - mouseDownPoint.X); this.picBox.Top = this.picBox.Top + (Cursor.Position.Y - mouseDownPoint.Y);
並記錄新鼠標的位置,完整的代碼如下:
private void picBox_MouseMove(object sender, MouseEventArgs e) { if (isSelected && IsMouseInPanel()) { this.picBox.Left = this.picBox.Left +(Cursor.Position.X - mouseDownPoint.X); this.picBox.Top = this.picBox.Top +(Cursor.Position.Y - mouseDownPoint.Y); mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; } }
其中的IsMouseInPanel()作用為判斷鼠標的位置是否已經超出操作的界面
private bool IsMouseInPanel() { if (this.pan_picture.Left < PointToClient(Cursor.Position).X && PointToClient(Cursor.Position).X < this.pan_picture.Left + this.pan_picture.Width && this.pan_picture.Top < PointToClient(Cursor.Position).Y && PointToClient(Cursor.Position).Y < this.pan_picture.Top + this.pan_picture.Height) { return true; } else { return false; } }
如果你需要將圖片限制在容器中,那你就要為此增加判斷條件了:
public static void picMoveNotOut(PictureBox picBox, Point mouseDownPoint) { int right, bottom; int differentX = Cursor.Position.X - mouseDownPoint.X; int differentY = Cursor.Position.Y - mouseDownPoint.Y; int want2Lef = picBox.Left + differentX; int want2Top = picBox.Top + differentY; right = picBox.Parent.Width - (picBox.Right + differentX); bottom = picBox.Parent.Height - (picBox.Bottom + differentY); if (want2Lef > 0) want2Lef = picBox.Left; if (want2Top > 0) want2Top = picBox.Top; if (right > 0 && differentX < 0) want2Lef = picBox.Left; if (bottom > 0 && differentY < 0) want2Top = picBox.Top; picBox.Left = want2Lef; picBox.Top = want2Top; }
好了,接下來就是MoveUp,釋放掉移動操作,代碼如下:
private void picBox_MouseUp(object sender, MouseEventArgs e) { isSelected = false; }
現在,拖動到這里就完成了。
下面我們再來說說怎么實現滾動縮放:
滾動,用到的事件,不用我說,你也知道,正是MouseWheel。
縮放我們可以這樣來實現:
首先我們要做的就是取得新圖片分辨率的寬(w)和高(h)。新的寬高,我們可以通過加減一個增減單位(zoom)來決定,一次滾動鼠標中鍵就是一次加減運算(zoom的大小由你來定)。剩下的就是重新繪制新圖了, 你可以直接用Bitmap來實現, 也可以通過Graphics來繪制。
我的MouseWheel事件代碼如下:
private void picBox_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) { int numberOfTextLinesToMove=0; numberOfTextLinesToMove=e.Delta *SystemInformation.MouseWheelScrollLines/120; if(toolStripComboBox1.Text.Trim()!="啟用縮放")numberOfTextLinesToMove=0; if (numberOfTextLinesToMove > 0) { for (int i = 0; i < numberOfTextLinesToMove; i++) { zoomtime++; OperateClass.maxMin(picBox, img_ori, zoomtime); } } else if (numberOfTextLinesToMove < 0) { for (int i = 0; i > numberOfTextLinesToMove; i--) { zoomtime--; OperateClass.maxMin(picBox, img_ori, zoomtime); } } }
因為我的操作都是直接通過原圖來進行縮放的, 所以用一個zoomtime來記錄縮放的次數。
具體源代碼:csdn下載(http://download.csdn.net/detail/kongfl888/4862935)
在我的OperaClass中對於縮放的操作定義了三種方法(更嚴格來說是兩種),雖說不是很完善,僅放出供大家參考。
(好了,第一篇博文,完成!)
轉載請注明作者及本文地址:
http://www.cnblogs.com/kongfl888/archive/2012/12/08/3351745.html