2011-02-07 65 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事件。