none
利用滑鼠移動所畫出的圖形 RRS feed

  • 問題

  • 各位大大

       小弟我想將我所畫的正方體(8個點 12個邊)  可以利用滑鼠按下左鍵之後可以去移動正方體 放開左鍵之後正方體會落在我所放開的位置 

      

    目前小弟我是

                         1.先把要畫的正方體的每個原點座標利用陣列先存放 在去畫出各個正方體

                         2.在畫出每個正方體的同時也將正方體之間的線給連結起來

                                   (正方體之間的線---我是利用2個正方體的原點 來做相連)

    所以現在小弟我希望 能將我所畫的正方體 然後利用滑鼠去移動正方體   不但可以移動正方體而且希望線也能跟著正方體的移動而變長或變短

     

    希望有高手大大能幫 小弟我解決難題

     

    在這先謝謝各位大大的幫忙  感恩^^

                         

     

     

    2007年8月21日 上午 07:40

解答

  • 比較簡單容易實做的方法,但比較浪費資源:

    建立一個使用者控制項來放你畫的圖,然後在該控制項上處理滑鼠動作。

     

    比較節省資源但比較難實做的方式 (以前在 Windows 3.x 上大概都這樣做):

    大量呼叫 API ,每個圖形都建立 hRgn ,然後判斷滑鼠座標是否落在這個 hRgn 內,然後在滑鼠動作處理重繪。

     

    至於正方體部份,一般是畫出來的,也就是看起來是,實際對電腦來說還是 2D ,自己去計算座標範圍。

     

    例如說這篇討論:

    回覆:UI 設計的問題(VB2005) 

     

    所以下面紅色的框線就是使用者控制項做出來的:

    2007年8月21日 上午 09:10
    版主

所有回覆

  • 比較簡單容易實做的方法,但比較浪費資源:

    建立一個使用者控制項來放你畫的圖,然後在該控制項上處理滑鼠動作。

     

    比較節省資源但比較難實做的方式 (以前在 Windows 3.x 上大概都這樣做):

    大量呼叫 API ,每個圖形都建立 hRgn ,然後判斷滑鼠座標是否落在這個 hRgn 內,然後在滑鼠動作處理重繪。

     

    至於正方體部份,一般是畫出來的,也就是看起來是,實際對電腦來說還是 2D ,自己去計算座標範圍。

     

    例如說這篇討論:

    回覆:UI 設計的問題(VB2005) 

     

    所以下面紅色的框線就是使用者控制項做出來的:

    2007年8月21日 上午 09:10
    版主
  • 先謝謝你提供的方法 我會試試看你的方法

     

    另外 我可以詢問你一件事 就是我有做scollbar    可是在畫圖(正方體)的動作執行時 

    假如我去移動scrollbar的話(利用滑鼠的中間鈕滾動)  則整個畫面都會閃動

    不知是否有辦法可以克服這個問題  讓正方體在畫的時候 去移動scrollbar不會讓整個畫面閃動

     

     希望你能在幫我這個忙   感激萬分^^...

     

    2007年8月23日 上午 08:05
  • 你如果放在 Form_Paint 本身一定會有這種問題,請搜尋前面討論關於圖形閃爍的討論,關鍵字 Paint WM_PAINT

    2007年8月23日 下午 01:40
    版主
  •  

    由於你提供了好方法 所以以上的問題解決的大半

    但我還想問你一個問題  就是我的正方體和正方體之間有線相連 

    我是在Panel的Graphics在Panel畫線
    然後在Panel上加一個PictureBox
    然後Picturebox
    加上了移動的事件
    但我在移動正方形時或移動scrollbar(也就是有refresh的時候)我的正方體和正方體之間的線就會消失.

     

    下面是我的畫線的程式

    (我是做四象限的  我已經紀錄了各個正方體的座標     然後判斷正方體所在的象限 利用彼此的座標來當作畫線的座標 在畫線)

     

     Public Sub drawLine(ByVal g As Graphics)

            '判斷所在的象限在去劃線
            If (recinfo(drewRec, 13) = 1) Then
                map.xLine = recinfo(drewRec, 5)
                map.yLine = recinfo(drewRec, 6)
            ElseIf (recinfo(drewRec, 13) = 2) Then '將此正方形的連結點由第二象限變第一象限
                map.x = map.x + LEN
                map.xLine = recinfo(drewRec, 7)
                map.yLine = recinfo(drewRec, 8)
            ElseIf (recinfo(drewRec, 13) = 3) Then '將此正方形的連結點由第三象限變第一象限+GAP
                map.x = map.x + LEN + GAP
                map.y = map.y - GAP

                map.xLine = recinfo(drewRec, 9)
                map.yLine = recinfo(drewRec, 10)
            ElseIf (recinfo(drewRec, 13) = 0) Then
                map.xLine = recinfo(drewRec, 11)
                map.yLine = recinfo(drewRec, 12)
            End If

            g.DrawLine(Pens.Green, map.xLine, map.yLine, map.x, map.y + GAP)

            If (recinfo(drewRec, 13) = 2) Then '還原此正方形的連結點由第一象限變第二象限
                map.x = map.x - LEN
            ElseIf (recinfo(drewRec, 13) = 3) Then '還原此正方形的連結點由第一象限+GAP變第三象限
                map.x = map.x - LEN - GAP
                map.y = map.y + GAP
            End If

     

     

    不知道 可不可以把線會消失的這個問題給解決  希望你能再給我些建議

    感謝你的幫忙 ^^

    2007年8月27日 下午 02:39
  • http://forums.microsoft.com/msdn-cht/ShowPost.aspx?PostID=1297399&SiteID=14

     

    裡面有兩個方向,請明確說明你採用哪種方向。

    2007年8月27日 下午 03:01
    版主