c# 鼠标事件 急!! 在线等 我在一个控件里边 按下鼠标左键 不放手然后移动到另一个控件里边,怎么激发另一个控件的mousemove事件? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我想的是用鼠标钩子的mousemove事件中判断第2个控件的位置,来激发第2个控件的mousemove事件 选种两个控件,在选mousemove事件 using System.Runtime.InteropServices; public partial class Form1 : Form { private readonly int MOUSEEVENTF_LEFTUP = 0x4; [DllImport("user32")] public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo); private void button2_MouseMove(object sender, MouseEventArgs e) { if (e.X > button2.Width) //判断鼠标是否移出控件 只判断了右方向 左上下 你自己根据你的控件写不 意思是一样的 { mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); } } //进入button3区域后 会相应它的MouseMove事件 private void button3_MouseMove(object sender, MouseEventArgs e) { button3.Text = (sender as Button).Name + DateTime.Now.ToString(); }}///mouse_event说明http://baike.baidu.com/view/1080208.htm 其实也可以使用委托直接调用第2个控件的mousemove事件的执行方法,传递的参数里包含当前鼠标的坐标要转换为第二个控件的相对坐标。 你给一段代码示例,运行环境VS2008以上,如果是VS2005,请自定义委托类型。private void button1_MouseMove(object sender, MouseEventArgs e){ Point sp = button1.PointToScreen(e.Location); Point fp = this.PointToClient(sp); if (fp.X > button2.Left && fp.X < button2.Right && fp.Y > button2.Top && fp.Y < button2.Bottom) { Point bp = button2.PointToClient(sp); MouseEventArgs e1 = new MouseEventArgs(e.Button, e.Clicks, bp.X, bp.Y, e.Delta); Action<object, MouseEventArgs> b2move = button2_MouseMove;//VS2008里的泛型委托,如果是VS2005,请自定义委托类型。 this.Invoke(b2move, button2, e1); } }private void button2_MouseMove(object sender, MouseEventArgs e){ MessageBox.Show("你碰到我了");} 你这样在button2不放开左键 是不会响应MouseMove的private void button2_MouseMove(object sender, MouseEventArgs e) { System.Windows.Forms.MessageBox.Show("你碰到我了"); } 怪小弟才疏学浅,不能举一反三。MouseEventArgs e1 = new MouseEventArgs(e.Button, e.Clicks, bp.X, bp.Y, e.Delta);这个对按钮是可以的。但是我现在想对dataGridView的cell(DataGridViewCellMouseEventArgs)怎么办啊? 你倒底是哪两个控件之间移动,是两个DataGridView吗?还是一个DataGridView的不同cell之间?要不你直接把两个控件的MouseMove事件都给贴出来,我看着事件名也可以猜到大概了。 就是要把label里边的内容拖到DataGridView的cell中 楼主就是要做个拖放功能啊别把你的问题说的那么神秘看一下几个事件:drag_out,drag_drop 貌似是啊,可能写错了 应该用拖放来实现,而不是什么鼠标移动,我只能给点提示你,毕竟实际操作比较麻烦,外加你没陈述清楚问题,害我绕个大圈,而我时间有限,没可能浪费那么多时间。 private void Form1_Load(object sender, EventArgs e) { dataGridView1.AllowDrop = true; } private void label1_MouseEnter(object sender, EventArgs e) { DoDragDrop(label1.Text, DragDropEffects.All); } private void dataGridView1_DragEnter(object sender, DragEventArgs e) { //这里根据收到的鼠标屏幕坐标,转换为dataGridView1的相对坐标后, //与dataGridView1的行高列宽作比较,算出当前鼠标位于哪个Cell上面, //然后对那个Cell的值设置。 } private void dataGridView1_DragOver(object sender, DragEventArgs e) { //这个可有可无,主要是设计在拖动过程中那些Cell的响应,比如可以当拖到某个Cell时, //那个Cell显示被选中状态。 } private void dataGridView1_DragEnter(object sender, DragEventArgs e) { //这里根据收到的鼠标屏幕坐标,转换为dataGridView1的相对坐标后, //与dataGridView1的行高列宽作比较,算出当前鼠标位于哪个Cell上面, //然后对那个Cell的值设置。 }我正是这种想法。但是没有想使用坐标我是利用dataGridView1_CellMouseEnter事件来获取是哪个Cell,问题就是当在一个控件上面按住鼠标左键之后,再移动到dataGridView1的Cell上 之后就不会激发这个事件了。虽然目前为止没有有效的解决问题,我还是十分感谢你,你让我学会了一种方法。你看看如果不换算坐标,能不能使用dataGridView1_CellMouseEnter事件来解决? 不行的,拖动过程中无法触发那个事件,如果手动调用那个事件,传递的参数中还是需要包含Cell的相关信息,比如是第几行第几列的Cell,那个信息还是需要通过鼠标当前的坐标位置来计算,那还不如直接计算后处理。 可以使用自定义消息的SendMessage,具体的网上有很多例子参考 按照我说的这个,自定义sendMessage也要计算Cell的坐标了? winform 窗体显示问题 谁懂C++.net请进来一下,谢~ 这个情况下,是用接口还是用类? comboBox的items改变时,鼠标消息了。 求助:父窗口如何从子窗口获得数据 想在FORM1中调用FORM2中的数据 在winform下,如何让DataGrid中一个列头单元格中显示多行,或让一个普通单元格显示多行,谢谢了,也给你们送分了! listbox 自绘问题 TEXTBOX只能输入4位数字, 哪里Visual Studio Tools for the Microsoft Office System的下载? C#如何变换XML标记? 互联网上的tcp连接
using System.Runtime.InteropServices; public partial class Form1 : Form
{
private readonly int MOUSEEVENTF_LEFTUP = 0x4;
[DllImport("user32")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
private void button2_MouseMove(object sender, MouseEventArgs e)
{
if (e.X > button2.Width) //判断鼠标是否移出控件 只判断了右方向 左上下 你自己根据你的控件写不 意思是一样的
{
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}
}
//进入button3区域后 会相应它的MouseMove事件
private void button3_MouseMove(object sender, MouseEventArgs e)
{
button3.Text = (sender as Button).Name + DateTime.Now.ToString();
}
}
///
mouse_event说明
http://baike.baidu.com/view/1080208.htm
{
Point sp = button1.PointToScreen(e.Location);
Point fp = this.PointToClient(sp);
if (fp.X > button2.Left && fp.X < button2.Right
&& fp.Y > button2.Top && fp.Y < button2.Bottom)
{
Point bp = button2.PointToClient(sp);
MouseEventArgs e1 = new MouseEventArgs(e.Button, e.Clicks, bp.X, bp.Y, e.Delta);
Action<object, MouseEventArgs> b2move = button2_MouseMove;//VS2008里的泛型委托,如果是VS2005,请自定义委托类型。
this.Invoke(b2move, button2, e1);
}
}private void button2_MouseMove(object sender, MouseEventArgs e)
{
MessageBox.Show("你碰到我了");
}
在button2不放开左键 是不会响应MouseMove的
private void button2_MouseMove(object sender, MouseEventArgs e)
{
System.Windows.Forms.MessageBox.Show("你碰到我了");
}
MouseEventArgs e1 = new MouseEventArgs(e.Button, e.Clicks, bp.X, bp.Y, e.Delta);这个对按钮是可以的。但是我现在想对dataGridView的cell(DataGridViewCellMouseEventArgs)怎么办啊?
楼主就是要做个拖放功能啊
别把你的问题说的那么神秘看一下几个事件:drag_out,drag_drop 貌似是啊,可能写错了
{
dataGridView1.AllowDrop = true;
} private void label1_MouseEnter(object sender, EventArgs e)
{
DoDragDrop(label1.Text, DragDropEffects.All);
} private void dataGridView1_DragEnter(object sender, DragEventArgs e)
{
//这里根据收到的鼠标屏幕坐标,转换为dataGridView1的相对坐标后,
//与dataGridView1的行高列宽作比较,算出当前鼠标位于哪个Cell上面,
//然后对那个Cell的值设置。
} private void dataGridView1_DragOver(object sender, DragEventArgs e)
{
//这个可有可无,主要是设计在拖动过程中那些Cell的响应,比如可以当拖到某个Cell时,
//那个Cell显示被选中状态。
}
{
//这里根据收到的鼠标屏幕坐标,转换为dataGridView1的相对坐标后,
//与dataGridView1的行高列宽作比较,算出当前鼠标位于哪个Cell上面,
//然后对那个Cell的值设置。
}我正是这种想法。但是没有想使用坐标我是利用dataGridView1_CellMouseEnter事件来获取是哪个Cell,问题就是当在一个控件上面按住鼠标左键之后,再移动到dataGridView1的Cell上 之后就不会激发这个事件了。虽然目前为止没有有效的解决问题,我还是十分感谢你,你让我学会了一种方法。你看看如果不换算坐标,能不能使用dataGridView1_CellMouseEnter事件来解决?