PictureBoxに画像をドラッグして貼り付けるには
デザイナーのプロパティウインドウでAllowDrag に true を設定し、DragDropとDragEnterのイベントハンドラをフォームごとに書くことになるけど、
いっぱい画面があると、毎回コピペするのも面倒。
Form.Designer.csを見てみると、
this.ccPictureBox1.AllowDrop = true;
this.ccPictureBox1.Image = ((System.Drawing.Image)(resources.GetObject(“ccPictureBox1.Image”)));
this.ccPictureBox1.Location = new System.Drawing.Point(96, 58);
this.ccPictureBox1.Name = “ccPictureBox1”;
this.ccPictureBox1.Size = new System.Drawing.Size(263, 200);
this.ccPictureBox1.TabIndex = 0;
this.ccPictureBox1.TabStop = false;
this.ccPictureBox1.Click += new System.EventHandler(this.ccPictureBox1_Click);
this.ccPictureBox1.DragDrop += new System.Windows.Forms.DragEventHandler(this.ccPictureBox1_DragDrop);
this.ccPictureBox1.DragEnter += new System.Windows.Forms.DragEventHandler(this.ccPictureBox1_DragEnter);
※ccPictureBox1は、前に作ったカスタムコントロール。
と、やっているだけだったので、コピペするだけのイベントハンドラならカスタムコントロールに埋めれてしまえばいい。
どうせAllowDrop = false になっていれば処理されることもない。
using System.ComponentModel;
using System.Windows.Forms;
namespace Custom.Control
{
class ccPictureBox : PictureBox
{
/// <summary>
/// コンストラクター
/// </summary>
public ccPictureBox()
{
this.DragDrop += new System.Windows.Forms.DragEventHandler(myDragDrop);
this.DragEnter += new System.Windows.Forms.DragEventHandler(myDragEnter);
}
[DefaultValue(false), Browsable(true), Description(“コントロールが、ユーザがドラッグしたデータを受け入れできるかを示します。”), Category(“動作”)]
public override bool AllowDrop { get; set; }
/// <summary>
/// ドラッグ処理のイベントハンドラー
/// </summary>
/// <param name=”sender”></param>
/// <param name=”e”></param>
private void myDragEnter(object sender, DragEventArgs e)
{
//ファイルならOKにしておく。
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
}
/// <summary>
/// ドラッグ処理のイベントハンドラー
/// </summary>
/// <param name=”sender”></param>
/// <param name=”e”></param>
private void myDragDrop(object sender, DragEventArgs e)
{
//ファイルなら
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
// ドラッグ中のファイルなどを取得
string[] drags = (string[])e.Data.GetData(DataFormats.FileDrop);
string fileName = null;
foreach (string d in drags)
{
if (!System.IO.File.Exists(d))
{
// ファイル以外であれば読み飛ばす。
continue;
}
fileName = d;
}
if (fileName != null)
{
this.ImageLocation = fileName;
e.Effect = DragDropEffects.Copy;
}
}
}
}
}
※DragDrop、DragEnterがevent型で、いくつもイベントハンドラを登録できるコレクションクラスなのでそのままoverrideできないのでイベントハンドラはmyDragDrop、myDragEnterとしている。
※複数ファイルをドラッグすると最後のファイルが貼り付く。