2017-01-19 25 views
0

を発生したときに、送信者に伝え、私は自分のフォームで、#3.5 /リサイズドラッグ&ドロップ:ドロップは

cを使用しています、私はパネルで、2つのPictureBox PB1とPB2(およびその他のコントロールの多くを)持っています。 ユーザーはPB1をPB2にドラッグできます。しかし、フォーム上の任意の場所またはフォームの外にある左ボタンを放すことによってドロップをキャンセルすることもできます。 PB1は固定回数だけドラッグできます。ドラッグが始まると、私はPB1の変数を減らし、0に達するとPBは見えなくなりました。

しかし、ユーザーがドラッグをキャンセルした場合、PB1はその変数を増やしてPB1の表示を設定する必要があります。

私の問題は、ドラッグがキャンセルされた(または実際に有効なコントロールであってもドロップされた)ことをPB1がどのように知ることができるかです。ユーザーはフォームの外にドラッグを解放できるので、フォームでドロップイベントを使用することはできません。私はGiveFeedbackとQueryContinueDragイベントを試していますが、ドラッグが続行されている間は起動されますが、停止しない限り起動されます。

いくつかのコード: "1〜4有効なターゲットがある"

class COPGOJetonImage 
{ 
    private PictureBox PB1; 

    public COPGOJetonImage() 
    { 
     PB1 = new PictureBox(); 
     //here I initialize PB1 
     ((Control)PB1).AllowDrop = true; //in case of 
     PB1.MouseDown += OnMouseDown; 
    } 
    public void OnMouseDown(object sender, MouseEventArgs ev) 
    { 
     PB1.DoDragDrop(PB1.Image, DragDropEffects.Copy); 
    } 
} 
+0

「PB2._にPB1をドラッグすることができ_Theユーザーは」PB2が唯一の有効なドロップターゲットですか?有効にドロップできる唯一の場所がフォームのどこかにある場合は、ドロップが発生したときに変数を減らすほうが意味があります。 –

+0

'DoDragDrop'はドロップターゲットによって設定された結果エフェクトを返すメソッドです – Plutonix

+0

実際には、有効なターゲットは1〜4です。 – bubarnet

答えて

2

この例では、我々はpictureBox1をドラッグしている、とpictureBox5からpictureBox2が有効なドロップターゲットです。ドラッグ&ドロップ操作中にpictureBox1をカプセル化するカスタム名を持つDataObjectを作成します。ドロップターゲットでは、カスタム名がドラッグされているものに存在する場合にのみドロップを許可します。これにより、pictureBox1からのDragDropイベントのみが確実に取得され、ドロップカウンタを減らすことは安全です。私たちは、バックのDataObjectからpictureBox1を取得し、それはもはや落とさないことができるように、その状態を変更することができます。

public partial class Form1 : Form 
{ 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private int DropsLeft = 5; 
    private string DataFormatName = "YourUniqueDataFormatNameHere"; 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     pictureBox1.MouseMove += PictureBox1_MouseMove; 

     PictureBox[] pbs = new PictureBox[] { pictureBox2, pictureBox3, pictureBox4, pictureBox5 }; 
     foreach (PictureBox pb in pbs) 
     { 
      pb.AllowDrop = true; 
      pb.DragEnter += Pb_DragEnter; 
      pb.DragDrop += Pb_DragDrop; 
     } 
    } 

    private void PictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      DataObject data = new DataObject(DataFormatName, pictureBox1); 
      pictureBox1.DoDragDrop(data, DragDropEffects.Copy); 
     } 
    } 

    private void Pb_DragEnter(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(DataFormatName)) 
     { 
      e.Effect = DragDropEffects.All; 
     } 
     else 
     { 
      e.Effect = DragDropEffects.None; 
     } 
    } 

    private void Pb_DragDrop(object sender, DragEventArgs e) 
    { 
     DropsLeft--; 

     // retrieve the data 
     PictureBox pb = (PictureBox)e.Data.GetData(DataFormatName); 

     if (DropsLeft == 0) 
     { 
      MessageBox.Show("No more drops left!"); 
      pb.Enabled = false; 
      pb.BackColor = Color.Red; // for visual effect 
     } 
    } 

} 
+0

あなたの答えをありがとう、私は本当に欲しいものを行うことは不可能だと私はそれを使用すると思います。実際はそれは問題のほんの一部です。あなたの方法では、PB2/PB5はドラッグのソースを知っており、ドラッグが終了したことをソースに伝えることができます。しかし、ユーザーがPB2/PB5以外の場所(フォーム上または別のウィンドウ上またはデスクトップ上)にドラッグをリリースした場合、ソースはそれを認識しません。 – bubarnet

+0

またはそれが必要なので、ドラッグが解放される前にPB1が反応することができます。ユーザーはドラッグを開始し、PB1の外観を変更します(たとえば、PB1の数字をドラッグして何回表示できるかを示します)。より多くのドラッグが可能です)。ドラッグオブジェクトがPB2/PB5でリリースされた場合、PB1は新しい外観を維持します。しかし、ユーザーがどこにいても解放すれば、PB1は古い外観に変わる必要があります。それでPB1がそれをどのように知ることができるのですか – bubarnet

+1

'DoDragDrop()'を呼び出す前にPB1の外観を変更できますが、これは簡単です。ドラッグを開始する前に 'bool'変数を作成し、' false'に設定してください。有効なドロップが行われると、フラグをトグルします。 'DoDragDrop()'の呼び出しは実際には**ブロッキング**なので、後でフラグをチェックして何が起きたのかを見ることができます。 –

関連する問題