作者cole945 (躂躂..)
看板C_Sharp
标题Re: [问题] 拖曳picturebox
时间Thu Apr 26 04:40:48 2007
※ 引述《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
1F:推 kenny0622:再次感谢您的回答!!! 我继续努力看看! 04/28 04:02