1

私は 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 は関係ありません。変更なしですべてコメントアウトできます。

4

1 に答える 1

2

私は自分の間違いを理解したので、他の誰かが同様の間違いを犯した場合に備えて、ここで回答します。その時は気がつきませんでしたが、私の質問で答えをほのめかしていたようです。

私の質問で、私はそれを述べました

カスタム コントロールのハンドルが作成される前 (デザイナー/コンストラクター コード経由) とハンドルが作成された後 (OnHandleCreated オーバーライド経由) の両方で、AllowDrop = true を設定しようとしました。動作に違いはありません。

これは実際に故障が発生した場所です。OnHandleCreatedの基本クラスの実装を呼び出すことを忘れないでOnHandleCreatedください。

Reflector は、の内部イベント通知構造のControl::OnHandleCreated設定を担当していることを示しています。Controlを呼び出したことがないControl::OnHandleCreatedため、内部イベント通知構造が適切に構築されていませんでした。このイベント構造 (リフレクターが再び表示されます) は発火OnDragOverなどを担当するため、欠落しているイベント構造により、欠落したイベントが発生しました。

答え:

OnHandleCreatedオーバーライドするときは、必ず の基本クラスの実装を呼び出してください。

于 2009-04-22T13:49:34.793 に答える