Re: [問題] 拖曳picturebox

看板C_Sharp (C#)作者 (躂躂..)時間18年前 (2007/04/26 04:40), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串4/4 (看更多)
※ 引述《kenny0622 ()》之銘言: : 還有三個小問題 : 第一個就是rectangle的contains在這個程式碼中是偵測拖曳中的滑鼠是否有在上面 : 但是我現在想要做的是讓一個控制項A在另一個控制項B之上 就被偵測到 : 是否要用先紀錄滑鼠在A之上的相對位置 算出一個矩形範圍 然後看有沒有跟B重疊 個人覺得用單點來判斷其實是比較好的做法 :~ 1. 好寫 2. 合理 不然一個 dragged 控制項有可能同一時間 over 另外兩個控制項, 那 drop 時, 到底算是 drop到哪一個呢? 如果你堅持的話, 可以參考 System.Drawing.Region 的 IsVisiable() 多載 ex: Region r = new Region( new Rectangle(0,0,100,100) ); r.IsVisiable( new Rectangle(50,50,100,100) ) 是 true 而 r.IsVisiable( new Rectangle(200,200,100,100) ) 則是false 或是用 Region的 Union()/Intersect() 再搭配 IsEmpty() 也可以達到相同的效果~ : 或是有類似的事件可以直接使用(DoDragDrop?) 你看到的 Drag/Drop 相關method全都是用來在控制項內或控制項間(含包ap間) 交換資料用的.. 像是你可以從檔案管理員drag and drop一個檔到記筆本去開敌 或是你把一個料夾移動到另一個資料夾, 都是用那個 DoDragDrop 來做的. 用 DoDragDrop 也可以達到你要的目的 但不會有你要的拖移picturebox的效果~ 1. 把 picturebox 的 AllowDrop 設成true 不然無法 drop 東西在上面 2. 在啟始端(drag)的 mouse down DoDragDrop(sender, DragDropEffect.All); 來開始拖放物件.. 3. 在接收端(drop)的 DragEnter e.Effect = DragDropEffect.All; 設定允許哪些行為/copy?move?link? 遊標會顯示對應的圖示 不允許drop就設 None 4. 在接收端(drop)的 DragDrop 執行 drop 後的完成動作 PictureBox pb = (PictureBox)e.Data.GetData(typeof(PictureBox)); pb blahblah....; : 第二個問題就是 : 亦即每一次tick會把textbox.text中的值加0.1 (interval是100ms) timer的interval只保證最快一個interval的時間會觸發一次.. 而且不會累計, 也就是說 100 的那次來不急處理, 200的那次已經到了.. 那 100的那次會被拾棄.. 所以計時應該要用終止時間-起始時間的方式來累計 : 當我在拖曳picturebox的時候(MouseMove) timer並不會tick =.= 你的mousemove可能寫的太複雜了? 兩個是同一個thread(worker thread?)在處理, 所以mousemove結束前, 當然也沒辦法處理 tick 的事件, 如果你的工作太複雜, 可以穿差一個 Application.DoEvents() 讓他先去處理別的message.. : 第三個問題是 : 那是不是60個MouseMove跟MouseDown的事件都要寫 : 還是有更快的方法? 用 for 迴圈動態建立啊 @_@a for( ....) { pictureBox = new PictureBox(); 設定location, size, mousedown, mosemove, borderstyle(?)... this.Controls.Add(pictureBox); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.139.147.4

04/28 04:02, , 1F
再次感謝您的回答!!! 我繼續努力看看!
04/28 04:02, 1F
文章代碼(AID): #16BxpHDo (C_Sharp)
討論串 (同標題文章)
文章代碼(AID): #16BxpHDo (C_Sharp)