我在一个控件里边 按下鼠标左键 不放手然后移动到另一个控件里边,怎么激发另一个控件的mousemove事件?

解决方案 »

  1.   

    我想的是用鼠标钩子的mousemove事件中判断第2个控件的位置,来激发第2个控件的mousemove事件
      

  2.   

    选种两个控件,在选mousemove事件
      

  3.   


    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
      

  4.   

    其实也可以使用委托直接调用第2个控件的mousemove事件的执行方法,传递的参数里包含当前鼠标的坐标要转换为第二个控件的相对坐标。
      

  5.   

    你给一段代码示例,运行环境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("你碰到我了");
    }
      

  6.   

    你这样
    在button2不放开左键 是不会响应MouseMove的
    private void button2_MouseMove(object sender, MouseEventArgs e)
            {
                System.Windows.Forms.MessageBox.Show("你碰到我了");
            }
      

  7.   

    怪小弟才疏学浅,不能举一反三。
    MouseEventArgs e1 = new MouseEventArgs(e.Button, e.Clicks, bp.X, bp.Y, e.Delta);这个对按钮是可以的。但是我现在想对dataGridView的cell(DataGridViewCellMouseEventArgs)怎么办啊?
      

  8.   

    你倒底是哪两个控件之间移动,是两个DataGridView吗?还是一个DataGridView的不同cell之间?要不你直接把两个控件的MouseMove事件都给贴出来,我看着事件名也可以猜到大概了。
      

  9.   

    就是要把label里边的内容拖到DataGridView的cell中
      

  10.   


    楼主就是要做个拖放功能啊
    别把你的问题说的那么神秘看一下几个事件:drag_out,drag_drop 貌似是啊,可能写错了
      

  11.   

    应该用拖放来实现,而不是什么鼠标移动,我只能给点提示你,毕竟实际操作比较麻烦,外加你没陈述清楚问题,害我绕个大圈,而我时间有限,没可能浪费那么多时间。        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显示被选中状态。
            } 
      

  12.   

            private void dataGridView1_DragEnter(object sender, DragEventArgs e)
            {
                 //这里根据收到的鼠标屏幕坐标,转换为dataGridView1的相对坐标后,
                   //与dataGridView1的行高列宽作比较,算出当前鼠标位于哪个Cell上面,
                   //然后对那个Cell的值设置。
            }我正是这种想法。但是没有想使用坐标我是利用dataGridView1_CellMouseEnter事件来获取是哪个Cell,问题就是当在一个控件上面按住鼠标左键之后,再移动到dataGridView1的Cell上 之后就不会激发这个事件了。虽然目前为止没有有效的解决问题,我还是十分感谢你,你让我学会了一种方法。你看看如果不换算坐标,能不能使用dataGridView1_CellMouseEnter事件来解决?
      

  13.   

    不行的,拖动过程中无法触发那个事件,如果手动调用那个事件,传递的参数中还是需要包含Cell的相关信息,比如是第几行第几列的Cell,那个信息还是需要通过鼠标当前的坐标位置来计算,那还不如直接计算后处理。
      

  14.   

    可以使用自定义消息的SendMessage,具体的网上有很多例子参考
      

  15.   

    按照我说的这个,自定义sendMessage也要计算Cell的坐标了?