標題:

aa.jpg

 

此文章來自奇摩知識+如有不便請留言告知

vb.net 影像拖曳

發問:

請教各位高手一下 我想用vb.net做一個 影像拖曳 的程式 在PictureBox貼上一張圖,這張圖大到需要靠卷軸去滑動才可以看到圖片的全部 那我想做圖片拖曳的動作.....就像看google地圖一樣 想往右看就點住滑鼠往左邊拖曳的動作 我該怎麼做? 更新: 我也寫了一個 介面和操作是我想要的 但我碰到一個問題 移動上沒有問題 但是要移動第2次 捲軸都會跳到最初的地方 垂直捲軸跳到最上面 捲軸跳到最左邊 就是我意見中提到的........ 請幫我過目一下 程式需要1個PictureBox sizemode屬性=StretchImage size屬性=786, 524 1個Panel AutoScroll屬性=true size屬性=594, 484 最好圖片放大一點能讓Panel的AutoScroll跳出 更新 2: Dim sCMouse As Point Dim mCMouse As Point Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown sCMouse.X = e.X sCMouse.Y = e.Y End Sub 更新 3: Private Sub PictureBox1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim a As Integer = 0 Do If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName) a = 1 End If Loop Until a = 1 End Sub 更新 4: Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove If e.Button = Windows.Forms.MouseButtons.Left Then mCMouse.X = e.X mCMouse.Y = e.Y Dim CMouseXnum As Integer Dim CMouseYnum As Integer 更新 5: CMouseXnum = mCMouse.X - sCMouse.X CMouseYnum = mCMouse.Y - sCMouse.Y imgMove(CMouseXnum, CMouseYnum) End If End Sub Private Sub imgMove(ByVal CMouseXnum As Integer, ByVal CMouseYnum As Integer) Dim ZeorMouse As Point ZeorMouse.X = Panel1.AutoScrollPosition.X 更新 6: ZeorMouse.Y = Panel1.AutoScrollPosition.Y CMouseXnum = CMouseXnum * 0.7 CMouseYnum = CMouseYnum * 0.7 ZeorMouse.X = ZeorMouse.X + CMouseXnum ZeorMouse.Y = ZeorMouse.Y + CMouseYnum Panel1.AutoScrollPosition = New Point(ZeorMouse) Panel1.AutoScrollPosition = ZeorMouse End Sub

最佳解答:

PictureBox載入圖片時,依據我的經驗,都是從左上角貼上。 所以單靠PictureBox是無法滑動圖片。 一般的做法是將PictureBox用Panel控制項框住 再寫個滑鼠移動PictureBox位置即可。 2013-05-02 08:27:28 補充: 以下是用滑鼠拖曳圖片的程式碼 表單設計 先建立PictureBox放照片 再用Panel框住 程式碼 Dim oldx, oldy As Integer Dim dx, dy As Integer Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown oldx = e.X '按下滑鼠左鍵時滑鼠的位置 oldy = e.Y End Sub Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove If e.Button = Windows.Forms.MouseButtons.Left Then '當滑鼠左鍵被按住移動時才進行 dx = e.X - oldx '計算滑鼠移動的距離 dy = e.Y - oldy PictureBox1.Left = PictureBox1.Left + dx '重新設定圖片的位置 PictureBox1.Top = PictureBox1.Top + dy End If End Sub 我用10吋小筆電跑1200萬素的照片容易有殘影 如果您電腦的速度快,應該不會有殘影 2013-05-03 11:09:47 補充: Dim oldx, oldy As Integer Dim dx, dy As Integer Dim x1, y1 As Short Private Sub PictureBox1_MouseDown(......... oldx = e.X oldy = e.Y x1 = Panel1.AutoScrollPosition.X y1 = Panel1.AutoScrollPosition.Y dx = 0 dy = 0 End Sub 2013-05-03 11:10:18 補充: Private Sub PictureBox1_MouseMove(......... If e.Button = Windows.Forms.MouseButtons.Left Then dx = (-(dx) + oldx) - e.X dy = ((-dy) + oldy) - e.Y Panel1.AutoScrollPosition = New Point(-(x1 + dx), -(y1 + dy)) End If End Sub 2013-05-03 11:45:51 補充: 這個程式碼不一定正確,但在運作上似乎沒有問題。 因為沒有用過 AutoScrollPosition, 剛開始看見您的程式,還真的找不出錯誤在哪裡。 經過不斷測試,終於發現原來它和Location的用法有截然不同的邏輯。 難怪怎麼改都無法成功。 我寫程式的習慣和您不同,所以修改後的程式碼和您有很大的差異。 至於設計的邏輯,需要花比較長的篇幅說明,在意見上說明恐怕很麻煩, 如果您同意及我有時間,我會另闢文章說明。 此外,我原先的解答也可以達到您的需求,概念也比較簡單, 您不訪試試看。 2013-05-05 10:31:29 補充: 已將程式碼的說明寫在文章中 名稱:VB的AutoScrollPosition與圖片移動

其他解答:

to銀亮 我發現用你的方法加上AutoScroll調成True 把滑鼠事件和捲軸一起用 我每次一移動 圖片位置會自動跳回左上角 為甚麼會這樣? 2013-05-03 12:44:04 補充: to 銀亮 謝謝您 有幸能聽到高手的設計邏輯 怎有不同意的道理 待您有空閒之餘再說明 這段程式是我目前在寫得程式分割出來問的 因為還需要去配合其他功能 我怕座標或繪圖會走位 所以沒考慮用Location的方法 但其實我也沒試過....說不定我想的是錯的 AutoScrollPosition是偶然看到的 只是網路上範例不多 所以只能寫到這裡就撞壁了 再次感激您的回答 畢竟程式這種東西學到的都是自己的 所以大大的方法我也蒐集下來並參考 2013-05-07 08:16:27 補充: 我看完了~ 辛苦大大了 寫得十分詳細BFC66BE0445C3814
arrow
arrow

    pxrnjl7 發表在 痞客邦 留言(0) 人氣()