C#實現圖片鼠標拖動和滾動縮放


對於一個圖片查看器來說,鼠標拖動和滾動縮放也就是說可以鼠標在程序界面上拖動圖片,通過鼠標滾輪放大和縮小圖片。這兩種功能在圖片瀏覽程序里面再普通不過了。那怎么用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

http://blog.csdn.net/kongfl888/article/details/8274033


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM