2009-04-21 3 views
1

私は、C++/CLIのカスタムコントロール(Forms.Controlの直下の子)を作成しました。このコントロールは、ほとんどの処理とそのペイントを別のlegacy-ish MFCコントロールにオフロードします。私はこのコントロールをC#アプリケーションでラップしています。私は、アプリケーション内の同じフォームのUserControlからC++/CLIコントロールに項目をドラッグできるようにする必要があります。カスタムコントロールにドラッグ/ドロップイベントが表示されないのはなぜですか?

何らかの理由で、私のカスタムコントロールAllowDropをtrueに設定しているにもかかわらず、私のカスタムコントロールがドラッグアンドドロップイベントを受け取っていません。 (私はAllowDropが実行時に真であることを確認しました)。コールバックが呼び出されないため、DragEventArgsを調べたり操作したりする機会はありません。

ドラッグアンドドロップが正常に機能することを確認しました。たとえば、カスタムコントロールをPanelに置き換えた場合、ドラッグドロップコールバックが正常に取得されます。

ドラッグドロップコールバックをサポートするためにコントロールに実装する必要がある何かがありますか?コントロールがホバリングされていることをシステムが認識するために処理しなければならない微妙なものはありますか?ドラッグドロップ操作のターゲットにする必要がありますか?

注:

塗装を行いますMFCコントロールは、まだ私には利用できないので、私はちょうど私がペイントしようとしていること(OnPaintBackground経由)、単純なグラデーションの背景を描きますよ。 OnPaintに小さなグラデーションの矩形を描いています。

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

ドラッグコントロールのカーソルは、カスタムコントロール上のデフォルトの「ドラッグしない」カーソルから変更されません。

私は、UserControlのサブコントロールのMouseDownイベントのイベントハンドラからthis.DoDragDrop()を呼び出しています。

DragDropは、ユーザーコントロールと同じアセンブリ内でC#で作成した別のカスタムコントロールで正常に動作するようです。それはちょうどうまくコールバックをキャプチャします。私のC++/CLIコントロールだけがそれらを見ていません。 initializecomponent gooは無関係です。私は変更なしでそれをすべてコメントすることができます。

答えて

2

私は間違いを知ったので、他の誰かが同様の間違いを犯した場合は、ここでそれに答えます。私はその時にそれを理解していなかったが、私は私の質問の答えにヒントをしたように見える。私は(私は両方のカスタムコントロールの ハンドルの前に 真= AllowDropを設定しようとした

が作成される( デザイナー/コンストラクタコード経由)と 後にハンドルが作成されていることを述べて、私の質問に

、 OnHandleCreatedオーバーライドを介して 経由)。いいえ 動作の違い。

これは実際に故障が発生した場所です。私はOnHandleCreated documentationを読むことに失敗しました。具体的には、基本クラスの実装OnHandleCreatedを覚えておく必要があると言いました。

反射器は、Controlの内部イベント通知構造の設定を担当することを示します(Control::OnHandleCreated)。私はControl::OnHandleCreatedを一度も呼び出さなかったので、内部イベント通知構造は決して正しく構築されませんでした。このイベント構造(リフレクターが再び示す)は、OnDragOverなどの発射を担当しています。そのため、欠落しているイベント構造によって欠落イベントが発生しました。

回答:

は、あなたがそれを上書きするときにOnHandleCreatedの基本クラスの実装を呼び出していることを確認してください!

関連する問題