C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: PictureBoxをクリックすると画像が消えてしまいます


(過去ログ 117 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■68656 / inTopicNo.1)  PictureBoxをクリックすると画像が消えてしまいます
  
□投稿者/ C#初心者 (12回)-(2013/11/04(Mon) 16:22:55)

分類:[C#] 

開発環境:VC#2010


お世話になります。

PicctureBoxに表示されている画像をドラッグ&ドロップで別のPictureBoxに移動するプログラムを作成しております。
(フォームロード時にPictureBox1に画像を表示、PictureBox1の画像をドラッグしPictureBox2にドロップで
 PictureBox1からPictureBox2へ画像が移動。)

下記のコードでPicutureBox間を移動するという目的は達成できました。
しかし、現在画像が表示されているPictureBox内にイメージをドロップ(シングルクリック)すると
画像が消えるという意図しない動作をしており、この原因がわからず苦慮しております。

なぜ画像が消えるのかご存じの方、ご教授願います。
また、より良い実現方法などありましたらお教えいただけると助かります。


//pictureBox1
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
Image img = this.pictureBox1.Image;
pictureBox1.Image = null;

if (img == null)
{
return;
}

if (DoDragDrop(img, DragDropEffects.Move) == DragDropEffects.Move)
{
pictureBox1.Image = null;
}
}

void pictureBox1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.Bitmap))
{
e.Effect = DragDropEffects.Move;
}
}

void pictureBox1_DragDrop(object sender, DragEventArgs e)
{
Image img = (Image)e.Data.GetData(DataFormats.Bitmap);
pictureBox1.Image = img;
}


//pictureBox2
private void pictureBox2_MouseDown(object sender, MouseEventArgs e)
{
Image img = this.pictureBox2.Image;
pictureBox2.Image = null;
if (img == null)
{
return;
}
if (DoDragDrop(img, DragDropEffects.Move) == DragDropEffects.Move)
{
pictureBox2.Image = null;
}
}

void pictureBox2_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.Bitmap))
{
e.Effect = DragDropEffects.Move;
}
}

void pictureBox2_DragDrop(object sender, DragEventArgs e)
{
Image img = (Image)e.Data.GetData(DataFormats.Bitmap);
pictureBox2.Image = img;
}

引用返信 編集キー/
■68657 / inTopicNo.2)  Re[1]: PictureBoxをクリックすると画像が消えてしまいます
□投稿者/ Azulean (234回)-(2013/11/04(Mon) 19:09:01)
No68656 (C#初心者 さん) に返信
> しかし、現在画像が表示されているPictureBox内にイメージをドロップ(シングルクリック)すると
> 画像が消えるという意図しない動作をしており、この原因がわからず苦慮しております。

たとえば、PictureBox1 からドラッグして、PictureBox1 にドロップしたとしましょう。
その場合、MouseDown の DoDragDrop によってドラッグが開始されますが、この時点では pictureBox1.Image = null; は実行されていません。
そして、ドロップすることによって pictureBox1_DragDrop が発生して、pictureBox1.Image に img が代入されます。
そして、DoDragDrop で一旦止まっていた処理が再開され、pictureBox1.Image = null; の行が実行されているのでしょう。

ドラッグ&ドロップの場合、ブレークポイントだと都合が悪いので、トレースポイントという機能を使うと、どういう流れをたどっているかがわかります。
http://www.atmarkit.co.jp/fdotnet/dotnettips/787tracepoint/tracepoint.html
あるいは、Debug.WriteLine とか入れておくと、どこを通ったかがわかるようにできます。


さて、解決策ですが、結構めんどくさいかもしれません。
要するに自分から自分へのドラッグ&ドロップを検知できないといけないので、それができる情報を一緒に渡すか、フラグで管理するかが必要です。
データを一緒に渡すなら IDataObject についての理解を深めてください。フラグで管理するならメンバー変数としてどこからドラッグ開始したか判別できるようにしてください。
あるいは、DoDragDrop 後の pictureBox1.Image = null; をなくしてコピーにしてしまうかですね。
引用返信 編集キー/
■68658 / inTopicNo.3)  Re[2]: PictureBoxをクリックすると画像が消えてしまいます
□投稿者/ C#???S?? (1回)-(2013/11/04(Mon) 21:02:27)
No68657 (Azulean さん) に返信

ご回答ありがとうございます。
GUIプログラミングは不慣れなもので、イベントの発生順を理解できておりませんでした。
ご提案いただいた解決策の中でフラグで管理するのがイメージに近いので、まずはフラグ管理でやってみます。
IDataObjectというのは初見でしたので、これを使ってのプログラムも書いてみようと思います。

ご回答いただき、誠にありがとうございました。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -