C#WinForms用鼠标拖动控件

时间:2011-02-07 01:08:22

标签: c# winforms controls calendar draggable

我正在使用WinForms在C#中制作日历。 我使用一个二维面板数组把它放在一起,在里面我有一个List<>自定义控件代表约会。

用户需要能够将约会控件从一个面板拖动到另一个面板(每天)。

自定义控件有一个MouseDown和MouseUp事件,它将一条消息从控件传递到Parent.Parent(自定义控件 - >日面板 - >日历表单)并调用公共方法StartDragging()和StopDragging( )分别。

在这些方法中,我复制了自定义控件并将其添加到Form中,并将其存储在名为DraggedControl的表单中的全局变量中。

Form有一个MouseMove的事件处理程序,如下所示:

    void Calendar_MouseMove(object sender, MouseEventArgs e)
    {
        if (DraggedControl == null)
            return;

        DraggedControl.Location = PointToClient(MousePosition);
        Refresh();
    }

然而,有两个问题:

  • 首先,自定义控件位于其他所有位置。我可以看到它在MouseDown和MouseUp上被添加和删除,但是它被添加到面板和日标签下的0,0。
  • 其次,它似乎根本没有移动鼠标移动。我有一种感觉,这可能是因为我按下按钮移动鼠标,这将代表拖动动作而不是基本的MouseMove。

如果我删除MouseUp代码,控件确实会用鼠标拖动,但是只要鼠标进入面板(控件就在下面),拖动操作就会停止。

你建议我做什么? 我怀疑可能有更好的方法来做我想做的事。

1 个答案:

答案 0 :(得分:2)

  

自定义控制在一切之下   其他

把它放在首位:

DraggedControl.BringToFront();
  

它似乎没有移动   所有的鼠标移动

控制,处理MouseDown事件,捕获鼠标输入并接收所有后续MouseMove事件,直到它在MouseUp事件上释放鼠标输入,这就是为什么不调用Calendar_MouseMove() 。处理生成MouseMove事件的同一控件的MouseDown事件。