棘手的控件移动问题,非高手勿进
private void panel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(e.Button==MouseButtons.Left)
{
canMove=true;
savePoint.X=e.X;
savePoint.Y=e.Y;
}
}
private void panel1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(canMove==true)
{
panel1.Location=new Point(e.X-savePoint.X,e.Y-savePoint.Y);
panel1.Refresh();
}
}
private void panel1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(e.Button==MouseButtons.Left)
{
canMove=false;
}
}
其中canMove为bool变量,savePoint为纪录鼠标位置相对窗体的Point坐标
出现的问题:
挪动panel1控件的时候总是闪!!而且跟随鼠标光标吃力!挪动太迅速范围太大的话一会儿竟然消失了~
曾经的解决办法!
按鼠标光标的Position(得到的是屏幕坐标)来挪动控件,问题解决!但是需要考虑到所有设备坐标都需要转换到屏幕坐标的问题!!并且同时又要计算需要挪动的控件和窗体的距离!而且把光标光标的Position转换成为设备坐标同样又是上面那个出现的问题!!导致程序耦合性比较大!!!Bug容易出!
现100分诚征高手解决此类问题!!并且请所有高手们注意,
1,请测试你的认为的程序以确保你的程序解决方案的正确性!不要自以为就写上来。
2,请不要给个网址让我自己去看文章,一方面是大部分高手指到的地方都是鸟文,另一个原因是我要的是可行性解决方法,不是一c++或一vb的解决方法等。
3,欢迎大家补充我的问题,但那些废话级的话大家还是不要跟在这里罢
完了!!谢谢大家解决我的问题!
----------------------------------------------------------------------
都说这里没有高手,我想知道这里到底有没有高手。
问题点数:100、回复次数:10Top
1 楼chestnuts(每天只答2道题的隐士)回复于 2003-02-01 22:46:12 得分 0
顺便说一句!我做了一个test程序用来测试鼠标位置的页面,屏幕,设备坐标以及光标坐标的程序!
竟然发现我的光标坐标和屏幕坐标不是同样的值!!!
使我的操作系统的bug?
抑或是.net framework 的bug?
抑或是vs.net的bug?
抑或是我的bug?Top
2 楼chestnuts(每天只答2道题的隐士)回复于 2003-02-01 22:51:09 得分 0
别到明天这时候跟帖的不到5人啊~~~
赌一下~~~~~~~~~
看看这里的高手究竟有多少~~~~~
Top
3 楼Tigatron(my release date has been changed)回复于 2003-02-01 23:10:50 得分 0
关于闪烁的问题,你在处理MouseMove的时候不应用Refresh(),因为改变Location的时候系统自动实现了重画Top
4 楼chestnuts(每天只答2道题的隐士)回复于 2003-02-02 00:09:49 得分 0
to Tigatron(Zeratul)
去掉refresh也一样闪!!
你自己try一try!Top
5 楼chestnuts(每天只答2道题的隐士)回复于 2003-02-02 09:26:20 得分 0
upTop
6 楼chestnuts(每天只答2道题的隐士)回复于 2003-02-02 11:11:59 得分 0
upTop
7 楼tansm(一个老想发财的家伙)回复于 2003-02-02 16:50:00 得分 100
private void panel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
if(e.Button==MouseButtons.Left) {
canMove=true;
savePoint.X=e.X;
savePoint.Y=e.Y;
}
}
private void panel1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {
if(canMove==true) {
panel1.Location=new Point(panel1.Left+ e.X-savePoint.X,panel1.Top+e.Y-savePoint.Y);
}
}
private void panel1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) {
if(e.Button==MouseButtons.Left) {
canMove=false;
}
}
注意:你的MouseMove事件写错了,下次自己做错了,不要说别人有bugTop
8 楼chestnuts(每天只答2道题的隐士)回复于 2003-02-02 21:16:35 得分 0
to tansm(一个老想发财的家伙)
真的是我太糊涂,太感谢了!太感谢了!Top
9 楼tansm(一个老想发财的家伙)回复于 2003-02-04 21:04:29 得分 0
光感谢不给分!!!!!!!!Top
10 楼Tigatron(my release date has been changed)回复于 2003-02-07 14:02:03 得分 0
private Point mouse_offset;
private void panel1_MouseDown(object sender,System.Windows.Forms.MouseEventArgs e)
{
mouse_offset = new Point(-e.X,-e.Y);
}
private void panel1_MouseMove(object sender,System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Point mousePos = Control.MousePosition;
mousePos.Offset(mouse_offset.X, mouse_offset.Y);
panel1.Location = panel1.Parent.PointToClient(mousePos);
}
}
这样也可以的,简洁明了Top




