Re: [問題] 拖曳picturebox
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章