2009-04-21 85 views
1

我已經在C++/CLI中編寫了一個自定義控件(Forms.Control的直接子代),它將其大部分處理和所有繪畫工作卸載到單獨的legacy-ish MFC控件中。我將這個控件包裝在一個C#應用程序中。我需要能夠從應用程序中的同一窗體上的UserControl中將項目拖到C++/CLI控件上。爲什麼我的自定義控件沒有收到拖放事件?

由於某些原因,儘管我將AllowDrop設置爲true,但我的自定義控件仍未收到任何拖放事件。 (我已經驗證AllowDrop在運行時是真的。)我從來沒有機會檢查/操作DragEventArgs,因爲回調從未被調用過。

我已驗證拖放功能是否正常。例如,如果我使用面板替換自定義控件,我會得到dragdrop回調。

是否還有一些額外的東西必須在控件中實現才能支持拖動回調?是否有必要處理一些微妙的事情,讓系統認識到控制器正在被盤旋並應該成爲拖動操作的目標?

注:

的MFC控制,將做畫還沒有提供給我,所以我只是畫我想要畫一個簡單的漸變背景(通過OnPaintBackground)。我還在OnPaint上繪製了一個較小的漸變矩形。

我已經嘗試在創建自定義控件的句柄(通過設計器/構造函數代碼)和創建句柄(通過OnHandleCreated覆蓋)之前設置AllowDrop = true。行爲沒有差異。

拖動光標永遠不會從自定義控件上的默認「無可用拖動」光標更改。

我從UserControl的子控件上的MouseDown事件的事件處理函數調用this.DoDragDrop()

DragDrop似乎可以與我在C#中創建的另一個自定義控件在與用戶控件相同的程序集中正常工作。它捕捉回調就好了。只有我的C++/CLI控件沒有看到它們。 initializecomponent goo是無關緊要的。我可以評論這一切,沒有任何改變。

回答

2

我想出了我的錯誤,所以我會在這裏回答,以防其他人犯類似的錯誤。看起來我提示我的問題的答案,雖然我當時沒有意識到。

在我的問題,我說,

我已經嘗試設置的AllowDrop =真 兩者之前創建自定義的控件的 手柄(通過 設計/構造函數代碼)和 後創建的句柄(通過 OnHandleCreated覆蓋)。沒有 的行爲差異。

這實際上是發生故障的地方。我沒有閱讀OnHandleCreated documentation,它明確指出我需要記住調用基類的實現OnHandleCreated

反射器顯示Control::OnHandleCreated負責設置Control的內部事件通知結構。我從來沒有打電話給Control::OnHandleCreated,所以內部事件通知結構從未正確構建。這個事件結構(反射器再次顯示)負責射擊OnDragOver等,所以缺少的事件結構導致我失蹤的事件。

答:

確保您調用基類實現的OnHandleCreated當你重寫它!

相關問題