日期:2014-05-20  浏览次数:21146 次

有关于MouseDown事件里怎么去监听MouseDown有没有被触发
Form上有一个圆点,当我鼠标在Form上点了一点之后,圆点就向我的鼠标点移动,如果这个时候我再点一下,我希望鼠标按照我新点的位置移动,就是说我必须在MouseDown事件里去监听MouseDown是不是再次被触发

请各位高手教教小弟!

------解决方案--------------------
你在MouseDown事件里面写上相应的操作代码不就行了 还要监听什么?直接有这个事件
------解决方案--------------------
在窗体上加入成员标志
bool IsFirstDown = false;
在MouseDown中判断
if(!IsFirstDown)
IsFirstDown = true; // 当前是第一次按下
else
IsFirstDown = false;
------解决方案--------------------
圆点是控件?还是GDI画图?

-----------------
如果圆点是控件(如imageBox),只要分别监听Form和控件的MouseDown

如果是GDI画图,只要在Form类里加一个bool标识变量!
------解决方案--------------------
你在MouseDown事件里面写上相应的操作代码不就行了 还要监听什么?直接有这个事件

同意这种意见,直接MouseDown事件里面写就行了
MouseDown事件里的代码的任务就是把圆点移动到鼠标所在处

------解决方案--------------------
压根就不存在需要监听的问题~~~~


不过如果你一定要监听,有的是方法,Windows消息也行, 用事件委托也行
------解决方案--------------------
lz说的应该是圆点移动的动画效果吧,圆点向鼠标点击位置移动有个过程,比如说在1秒钟内平均速度移动过去。在0.5秒的时候鼠标又在另外一个位置点击了一下,然后要让圆点移动方向改变成朝新的点击位置移动,对不对?

保存2个位置,一个圆点当前位置,一个是鼠标点击位置。每次鼠标点击时记录鼠标点击位置。每隔一段时间(比如说0.1秒)将圆点位置向保存的鼠标点击位置移动一定距离。
------解决方案--------------------
至少需要保存2个变量,就是圆点当前位置和鼠标点击位置。如果你不想用定时器每隔一段时间重绘圆点位置的话,循环不能用局部变量判断,要放在Form里作为成员变量。

比如
Form{
Point start;
Point target;
Point current;
int step;
bool isMoving = false;

void MouseClick(MouseEventArgs e){
start = current;
target = e.Point;
step = 0;
if(!isMoving){
isMoving = true;
for(;step < max;step++){
current = GetCurrent(start ,target ,step);
Draw();
sleep(100);//这里用sleep应该不行,换成你自己所实现的定时
}
isMoving = false;
}
}

自己看下可不可以改,最好要加上同步。
------解决方案--------------------
想法:
圆点移动需要另外启动一个线程
这个线程和界面的UI线程进行交互
交互的数据就是你点击位置
新线程每移动一步
都根据UI线程中通过MouseClick事件的得到的新的位置进行方向调整
然后在移动,直到与点击位置重合
------解决方案--------------------
你是怎么绘图的,用自己写的线程还是用Timer控件定时控制?
我想你不会是用简单的for循环来控制吧??

无论是线程还是Timer,过程应该是
1.MouseDown事件接收到鼠标的点击事件;
2.判断绘图线程是否启动(即判断绘图标志是否启动 if(!drawing) ),如果没有启动,那么开始启动绘图线程,设置绘图标志为正在绘制的状态 drawing = true,同时在全局变量(可以设置为静态)中记录目标的位置X和Y; 如果已经启动,那么重新设置X,Y的值,线程应该会根据X,Y的值重新计算移动的方向并移动.
3.移动到目标点,设置drawing = false,等待下一次的命令

------解决方案--------------------
中途有点了自动就会停止当前动作处理新的移动事件了
要全局变量判断第几次干什么?
------解决方案--------------------
设置个标志嘛
比如弄个GUID表示最后次鼠标点击生成的标志,循环移动的时候判断这个标志

窗体类里面申明一个
private string id;

mousedown:
id = Guid.NewGuid().ToString();

move:
string oldid = id;
while(oldid == id)
{
.......
}
------解决方案--------------------
你代码怎么写的 最好贴一下
如果x y存在全局里面还是不需要bool变量的
------解决方案--------------------
你是直接用Form的sleep()吗?那样不行,线程停了就不会响应click事件了。
要另外起个线程,用VS提供的定时器好了。
------解决方案--------------------
aaajedll() :