求解 按下鼠标不能触发mousemove事件

after2014 2016-08-02 10:02:23
现在做一个东西,需要按下鼠标时触发mousemove事件来实现绘图功能。跪求大神解答,不胜感激!!
...全文
1897 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
desperaso 2019-03-01
  • 打赏
  • 举报
回复
举例子啊,
在一个组件上面判断鼠标是否按下,按下后,用另一个组件覆盖当前页面,那么鼠标移动事件在当前组件是无效的,
应该判断覆盖组件,也就是另一个组件的移动事件。
实际中,按下鼠标后,另一个组件覆盖,并没有判断移动事件,模拟点击后就可以了。
例子:按住框框移动,松开复原,就是上面方法。看组件的事件不同
https://pan.baidu.com/s/1XjsblDPxu_yYOSxFNfXysQ
提取:40s2
wwwspider001 2019-03-01
  • 打赏
  • 举报
回复
1、控件鼠标按下后,鼠标就被该控件捕获,直到鼠标主动松开或被迫失去焦点,这期间移动鼠标,只会触发本控件的mousemove。 2、【题主】或【周者】谈到的鼠标经过其他控件不会触发mousemove,完全可以在本控件的mousemove中做判断,处理控件移动或其他问题。 3、题主的解题思路出了点问题,应该是在一个控件中,对鼠标各种操作做些数据记录,根据相应的数据,在一个控件中完成所有绘图即可搞定。 为了省事,使用了现有控件来代替绘图,看似省事,实际上是把事情复杂化了 找下简单的绘图代码看一眼即可搞定。
qbilbo 2019-02-28
  • 打赏
  • 举报
回复
鼠标按下时,按在哪个控件上,在鼠标放起来前,mousemove事件就只会由那个控件触发。途中经过了其它控件,经过的控件并不会触发mousemove事件。

对于你的问题,你可以将所有需要mousemove事件的控件的事件处理函数指向同一个函数,在函数中获取鼠标相对于父窗口的坐标,再来判断就行了。

如:
private void ctl_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Control ctl = (Control)sender;

int x = ctl.Left + e.X;
int y = ctl.Top + e.Y;

foreach (Control c in ctl.Parent.Controls)
{
if (x > c.Left && x < c.Left + c.Width &&
y > c.Top && y < c.Top + c.Height)
c.BackColor = Color.Red;
else
c.BackColor = SystemColors.Control;

}
}
}
assky124 2019-02-28
  • 打赏
  • 举报
回复
你的鼠标跑到别的控件上去了吧,Mouse的事件都是关联控件的,除非其他的控件Enable = false。 拖拽有单独的Drag Drop 事件
学者(cloudea) 2019-02-28
  • 打赏
  • 举报
回复
我也遇到了此问题。感觉c#好垃圾。。。 mousemove事件正常情况下是可以触发的。(即鼠标在元素之上移动) 但是当按下左键不松开时,经过元素,不会触发mouseover. 这样导致我不能实现元素的拖动。2019年了啊~
desperaso 2019-02-28
  • 打赏
  • 举报
回复
刚好,也碰到这个,搞好了
MouseDown里模拟点击再移动


[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

public static void IsMove_MouseDown(object sender, MouseEventArgs e)
{
Control pL = (Control)sender;
..................................
.................................
if (!current)
{
current = true;
................................
mouse_event(0x0002 | 0x0004, Cursor.Position.X, Cursor.Position.Y, 0, 0);
}

public static void IsMove_MouseMove(object sender, MouseEventArgs e)
{
Control pL = (Control)sender;

if (current)
{
.................................................
}
}
after2014 2016-08-13
  • 打赏
  • 举报
回复
引用 6楼摇撼大地 的回复:
试试这样。在click事件相应函数中,添加onmouseover方法,这个方法触发mouseover事件。 代码差不多应该是这样:

this.click+=function;
private void function(objcet obj,eventargs e){
     this.onmouseover();

}

手打的。可能不对,思路应该是这样。
是这样的,我做了一个若干label或panel作为小像素格组成成的位图绘画板。绘好后方便提取对应的二进制代码,以用于底层设备编写用。现在实现的原理是,我在每个像素格(label或panel)上绑定一个事件,当鼠标经过它时它就变色,以此达到绘图效果,目前就是想在按下鼠标的情况如何在经过某一像素格子时触发它。
摇撼大地 2016-08-13
  • 打赏
  • 举报
回复
不知道你想表达什么意思。。。。 反正就是, 绑定事件,就是+= 定义事件,就是做一个函数。 触发事件,就是用事件相对应的on函数就行了。什么问题都解决了。
摇撼大地 2016-08-12
  • 打赏
  • 举报
回复
试试这样。在click事件相应函数中,添加onmouseover方法,这个方法触发mouseover事件。 代码差不多应该是这样:

this.click+=function;
private void function(objcet obj,eventargs e){
     this.onmouseover();

}

手打的。可能不对,思路应该是这样。
after2014 2016-08-12
  • 打赏
  • 举报
回复
引用 1楼我叫小菜菜 的回复:
在按下鼠标事件(click)中调用btn1_mousemove(sender,null)。 null或者new mousemoveEvent都行
不行啊亲
after2014 2016-08-12
  • 打赏
  • 举报
回复
引用 3楼xuzuning 的回复:
mousemove事件只在鼠标移动时触发(既然是鼠标绘图,鼠标自然不可能固定在一点上) 你只需在 mousemove事件 中检查鼠标键是否还继续按着就可以了
检测不了啊,只要一按下鼠标后,移动到任何块里都不触发任何事件,途经那个块时也无法检测鼠标状态。
xuzuning 2016-08-02
  • 打赏
  • 举报
回复
mousemove事件只在鼠标移动时触发(既然是鼠标绘图,鼠标自然不可能固定在一点上) 你只需在 mousemove事件 中检查鼠标键是否还继续按着就可以了
john_QQ:2335298917 2016-08-02
  • 打赏
  • 举报
回复
引用 1 楼 zhi_ai_yaya 的回复:
在按下鼠标事件(click)中调用btn1_mousemove(sender,null)。 null或者new mousemoveEvent都行
对,在click中出发mousemove事件
我叫小菜菜 2016-08-02
  • 打赏
  • 举报
回复
在按下鼠标事件(click)中调用btn1_mousemove(sender,null)。 null或者new mousemoveEvent都行

111,077

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧