2010-12-13 10 views
0

「ハイテク」電話帳プログラムを作成しています。成功すると、番号や人、場所を別のプロファイルページにドラッグアンドドロップしてリンクできます一緒に。ドラッグドロップのVisual C++の問題

要素(数字や人物など)は、System :: Windows :: Forms :: UserControlから派生したクラスで表されます(基本的に、ラベルを持つパネルと、メンバー変数に格納されている表現された要素に関するデータです) 。このパネルはウィンドウにドラッグされ、別のウィンドウのコンストラクタに渡され、要素間のリンクが作成されます。この要素をクリックすると、プロファイルページがウィンドウに表示されます。

ドラッグアンドドロップを提供する要素、のコード:

/* PhonebookElement.h */ 
private: 
    System::Void PhonebookElement_Click(System::Object^ sender, 
      System::EventArgs^ e) { 
     doClick(); 
    } 

    System::Void nameLabel_MouseDown(System::Object^ sender, 
      System::Windows::Forms::MouseEventArgs^ e) { 
     DragDropEffects dde = DoDragDrop(this, DragDropEffects::Copy); 
     if(dde == DragDropEffects::None) 
      doClick(); 
    } 

ドラッグアンドドロップを受け付けるプロフィールページウィンドウのコード:

/* PhonebookInfoWindow.h */ 
private: 
    System::Void PhonebookInfoWindow_DragOver(System::Object^ sender, 
      System::Windows::Forms::DragEventArgs^ e) { 
     e->Effect = DragDropEffects::Copy; 
    } 

    System::Void PhonebookInfoWindow_DragDrop_1(System::Object^ sender, 
      System::Windows::Forms::DragEventArgs^ e) { 
     MakeRelationWindow^ mrw = gcnew MakeRelationWindow(this->m_hparent, 
      (PhonebookElement^)e->Data->GetData(
       System::Windows::Forms::DataFormats::Serializable),this); 
     mrw->Show(); 
    } 

のコンストラクタ関連メーカーのウィンドウ:

/* MakeRelationWindow.h */ 
MakeRelationWindow(PhonebookElement^ first, PhonebookElement^ second, Object^ parent) 
{ 
     InitializeComponent(); 
     // 
     //TODO: Add the constructor code here 
     // 
     this->typeBox->MaxLength = LSTRINGLENGTH; 

     this->first = first; 
     this->second = second; 
     this->parent = parent; 

     this->descriptionBox->Text = "Linking together\r\n" + 
      this->first->maindata + "\r\nand\r\n" + this->second->maindata; 
} 

私は2つの問題があります。
1.私はPhoneBookElementのMouseDownアクションを実装しているので、クリックを認識しません。 (私はMouseClickアクションを試しましたが、どちらもうまくいきませんでした)if(dde == DragDropEffects::None){doClick();}の部分を回避策としてMouseDownアクションに入れましたが、ユーザーがコントロールをどこかにドラッグすると、それもクリックとして扱われます。
2.すべてがうまくいきません:D
私は何が間違っているのか分かりません(GetData()関数を使用している可能性がありますが、DataFormatsについてよく知らないですが) MakeRelationsWindowは2番目のパラメータとして「未定義の値」を取得します。

これら2つの問題を修正するにはどうすればよいですか?

P.S.私はこのチュートリアルに従っていた:http://www.codeproject.com/KB/dotnet/csdragndrop01.aspx
これはC#とドラッグドロップ文字列ですが、それでも私が見つけることができる最高のものです。

答えて

2

DragEnterイベントハンドラがないために動作しません。 DragDropイベントを実行するには、e-> AllowedEffectsのいずれかにe-> Effectを設定する必要があります。 DragOverは、フィードバックを提供するためのものです。

MouseDownでドラッグを開始すると、実際にはClickイベントが妨げられ、クリックをトリガーするマウスアップイベントは発生しません。両方をサポートしたい場合は、それをより選択的にする必要があり、ユーザーがドラッグ操作をしたときにのみドラッグを開始します。そのためには、マウスの位置をMouseDownイベントに格納する必要があります。 MouseMoveイベントを使用して、左ボタンがまだダウンしているかどうかを確認します。また、マウスがSystemInformation :: DoubleClickSize以上移動したときにDoDragDrop()を呼び出します。

また、DragEnterイベントハンドラで、オブジェクトのドラッグ方法を知っていることを確認する必要があります。エクスプローラからファイルをドラッグすることは許されません。

+1

また、MouseDownでマウスキャプチャを有効にし、カーソルがコントロールの境界外にある場合は、MouseMoveからDoDragDropを呼び出します。 –

+0

お返事ありがとうございます。私は、 'MakeRelationWindow(this-> m_hparent、(PhonebookElement))e-> Data-> GetData(System :: Windows :: Forms :: DataFormats :: Serializable)を変更することで2番目の問題を解決しました。 '' MakeRelationWindow(this-> m_hparent、(PhonebookElement ^)e-> Data-> GetData(this-> m_hparent-> GetType() - > ToString())」)、これはDragOverでもうまく動作します;最初のものについては、私はあなたのソリューションを試しています、もう一度ありがとう。編集: 'this-> m_hparent'はもちろんPhonebookElement ^オブジェクトなので、ここで必要な型情報を得るために使うことができます –

+0

これはトリッキーでした。ありがとう –

関連する問題