私は C++/CLI でカスタム コントロール (Forms.Control の直接の子) を作成しました。これは、その処理のほとんどとすべての描画を別のレガシーな MFC コントロールにオフロードします。このコントロールを C# アプリケーションにラップしています。アプリケーションの同じフォームの UserControl から C++/CLI コントロールにアイテムをドラッグできるようにする必要があります。
何らかの理由で、AllowDrop を true に設定しているにもかかわらず、カスタム コントロールがドラッグ アンド ドロップ イベントをまったく受信しません。(AllowDrop が実行時に true であることを確認しました。) コールバックが呼び出されないため、DragEventArgs を調べたり操作したりする機会がありません。
それ以外の場合、ドラッグ アンド ドロップが正常に機能することを確認しました。たとえば、カスタム コントロールを Panel に置き換えると、dragdrop コールバックが正常に取得されます。
ドラッグドロップ コールバックをサポートするために、コントロールに実装する必要がある追加機能はありますか? コントロールがホバーされており、ドラッグドロップ操作のターゲットであることをシステムが認識するために対処しなければならない微妙なことがありますか?
ノート:
OnPaintBackground
ペイントを行う MFC コントロールはまだ利用できないので、ペイントしようとしている単純なグラデーションの背景を ( 経由で) ペイントしています。で小さなグラデーションの長方形もペイントしていOnPaint
ます。
カスタム コントロールのハンドルが作成される前 (デザイナー/コンストラクター コード経由) とハンドルが作成された後 (OnHandleCreated オーバーライド経由) の両方で、AllowDrop = true を設定しようとしました。動作に違いはありません。
ドラッグ カーソルは、カスタム コントロール上のデフォルトの「ドラッグ不可」カーソルから変更されることはありません。
UserControl のサブコントロールのイベントthis.DoDragDrop()
のイベント ハンドラーから呼び出しています。MouseDown
DragDrop は、ユーザー コントロールと同じアセンブリで C# で作成した別のカスタム コントロールで正常に動作するようです。コールバックをうまくキャプチャします。私の C++/CLI コントロールだけがそれらを認識していません。initializecomponent goo は関係ありません。変更なしですべてコメントアウトできます。