2011-04-15 240 views
0

假設我有一個創建的Form類和一個CustomControl類。C#手動觸發的MouseDown無法觸發MouseUp

在我的窗體上我有兩個CustomControl實例和一個Panel。 (MouseEnter)(用於指定不同的遊標),MouseLeave(用於重置遊標),MouseDown(用於啓動拖動線程)和MouseUp(用於殺死拖動線程並執行後拖動邏輯)。 )。

我可以將面板拖到CustomControl上。當我這樣做時,Form中的代碼檢測到我做了什麼,並從Form.Controls中刪除Panel,將一些元信息傳遞給CustomControl,然後它自己創建一個Panel。

基本上,它是一個交接。 Panel對象現在屬於CustomControl。 (這是必要的。這是複雜的,解釋爲什麼,但想象中的自定義控件具有類似滾動條,而對於面板屬於CustomControl,使其與CustomControl滾動這是必要的。)

現在,當我點擊CustomControl中的面板時,面板的MouseDown被觸發,它從CustomControl.Controls中被刪除,併發送一些元信息返回到Parent(表單),然後重新創建Panel,因爲它是在開始 - 然而已經處於拖動狀態,以便用戶可以將Panel重新定位到第二個CustomControl上,或者可以將其重新放回到Form上。 Form首次初始化時創建Panel的函數與現在創建它的函數完全相同。

但是,面板的MouseDown沒有被觸發。鼠標,但事件未觸發,因爲鼠標在創建時已關閉。所以,我在Form中的函數中手動調用MouseDown處理函數,該函數接受來自CustomControl的元信息。

不幸的是,這隻有一半工作。 MouseUp處理程序未觸發。我可以按照預期從CustomControl中取出面板並在窗體上拖動它,但當釋放鼠標時,面板將卡在光標上。

我不確定如何解決這個問題?

一個理想的解決辦法是,當元信息被傳遞迴形式,是創建新的面板,MouseDown事件以某種方式自然就像用戶剛剛點擊在面板上的火。

+0

僅僅因爲您調用了Mousedown事件,並不意味着面板認爲鼠標已被按下。看看實際發送的mousedown窗口消息到面板。 – 2011-04-15 02:53:29

回答

0

聽起來好像你正在創建一個Panel的新實例,當你將它從CustomControl移動到Form並返回並丟失它的狀態時。

您應該嘗試將Form所擁有的實際實例傳遞給CustomControl而不創建新的實例,或者您可以在另一個對象中捕獲Panel的狀態,您可以在創建新Panel時將其傳遞給構造函數,它與你正在拖動的那個處於相同的狀態?

看起來好像您嘗試手動觸發鼠標事件來彌補設計中的問題。

如果你可以比冗長的文本解釋更好地給出一些示例代碼。

+0

CustomControl和Form中的面板必須是兩個不同的面板,外觀和控件略有不同。他們有不同這個模塊有幾百行 - 我可能會找到一個解決方法,當我在這裏修剪它的例子。 – Ozzah 2011-04-15 02:43:10