2011-02-07 134 views
3

我正在制作一个日历从C#中使用WinForms。 我已经把它放在一起使用一个面板的二维数组,并在里面我有一个代表约会的自定义控件列表<>。C#WinForms用鼠标拖动控件

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

自定义控件有一个MouseDown和MouseUp事件,它将控件向上传递给Parent.Parent(自定义控件 - >日期面板 - >日历窗体),并调用公共方法StartDragging()和StopDragging()分别。

在这些方法中,我制作了自定义控件的一个副本并将其添加到Form中,并将其存储在名为DraggedControl的窗体中的全局变量中。

表单具有的MouseMove的事件,其任务是这样的:

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

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

有两个问题,但是:

所有的
  • 首先,自定义控制下一切。我可以看到它在MouseDown和MouseUp上被添加和删除,但它在面板和day标签下的0,0处添加。
  • 其次,它看起来并没有随着MouseMove一起移动。我有一种感觉,这可能是因为我正在按下按钮移动鼠标,这将代表一个拖动操作而不是基本的MouseMove。

如果我删除了MouseUp代码,控件会用鼠标拖动,但只要鼠标进入面板(该控件很可悲地在下面),拖动操作就会停止。

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

回答

2

定制控制下的一切 其他

把它顶:

DraggedControl.BringToFront(); 

它不会出现在所有

与 移动鼠标移动

控制,该处理MouseDown事件,捕获鼠标输入和接收所有以下MouseMove事件,直到它释放的MouseUp事件鼠标输入,这就是为什么Calendar_MouseMove()不叫。处理MouseMove事件为相同的控件,从而生成MouseDown事件。