C#での画像ファイルをドラッグアンドドロップで描画

このQ&Aのポイント
  • C#で画像ファイルをドラッグアンドドロップで描画させるプログラムを作りたいが、エラーが発生してしまう。
  • ファイル名の画像ファイルをForm1に描画させる部分でエラーになってしまい、修正方法が分からない。
  • 質問者はC#でドラッグアンドドロップで画像ファイルを描画させるプログラムを作りたいが、問題が発生している。
回答を見る
  • ベストアンサー

C#での画像ファイルをドラッグアンドドロップで描画

C#で画像ファイルをドラッグアンドドロップで描画させるプログラムを作りたいのですが、うまくできません。 ドラッグしたファイル名を読み取る部分までは動作確認できています。このファイル名の画像ファイルをForm1に描画させる部分でエラーになってしまいます。 どのように修正したらよいのかわからないのでお助けください。 ----- using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Drag {   public partial class Form1 : Form   {     public Form1()     {       InitializeComponent();     }     private void Form1_DragEnter(object sender, DragEventArgs e)     {       e.Effect = DragDropEffects.All;     }     private void Form1_DragDrop(object sender, DragEventArgs e)     {       Graphics g = e.Graphics;   // <------ エラーになる。       if (e.Data.GetDataPresent(DataFormats.FileDrop))       {         foreach (string fileName             in (string[])e.Data.GetData(DataFormats.FileDrop))         {           g.DrawImage(new Bitmap(fileName, new PointF(10F, 50F)));           // Console.WriteLine(fileName); // 動作確認         }       }     }   } }

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

DragEventArgsには Graphicsがありません やるとすれば Image型または Bitmap型の変数をフォームに準備しておいて これにファイルから読み込んでおいて Paintイベントで描画しましょう public partial class Form1 : Form {   Image[] img;   private void Form1_DragDrop(object sender, DragEventArgs e)   {     if (e.Data.GetDataPresent(DataFormats.FileDrop))     {       int n = 0;       Image tmp = null;       foreach (string fileName         in (string[])e.Data.GetData(DataFormats.FileDrop))       {         Image tmp = null;         try         {           img = new Bitmap( fileName );           Array.Resize( ref img, n + 1 );           img[n] = new Bitmap( fileName );           n++;         }         catch(Exception)         {         }       }     }   }   private void Form1_Paint(object sender, PaintArgs e )   {     if ( img != null )     {       int x = 0;       for( int n = 0; n < img.length; n++ )       {         e.Graphics.DrawImage( img[n], x, 0 );         x += img[n].Length;         n++;       }     }   } } といった具合で ・・・

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

DragDropでファイルからイメージを読み込んだら 再描画のためにInvalidate()を呼んでやればいいでしょう

usatan2
質問者

お礼

おかげさまで、希望する描画ができました。 redfox63さん、今回も応答ありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

Paintイベントを一部修正 m(__)m n++; が不要でした   private void Form1_Paint(object sender, PaintArgs e )   {     if ( img != null )     {       int x = 0;       for( int n = 0; n < img.length; n++ )       {         e.Graphics.DrawImage( img[n], x, 0 );         x += img[n].Length;         // これは不要でした ・・・         // n++;       }     }   }

usatan2
質問者

お礼

早速の回答ありがとうございました。 教示いただいたリストではエラーが出ましたので、 一方の、Image tmp = null; を削除し、 img = new Bitmap(fileName);をtmp = new Bitmap(fileName); に修正しましたら、描画しました!! でも、そのままでは描画せず、別のウインドの影に一旦隠して再度表示すると描画されました。Form1_Paintをどこかで強制的に呼び出さないとだめということでしょうか?

関連するQ&A

  • C#でドラッグ&ドロップが機能しない。

    使用OSはWindows8で 開発環境はVisualStudio2012 (.NET Framework4.5)です。 ListBox1にドラッグ&ドロップでファイル名を表示する機能を追加したいと思い、以下のようなコードを記述しました。また、ListBox1のイベントととしてListBox1ListBox1_DragEnterとListBox1_DragDropを関連づけました。 この状態でビルドして動作を確認してみると、問題なく動作しました しかし、debugフォルダ内のEXEファイルを直接起動するとドラッグ&ドロップ不可のマークが出てしまいます。 なにが問題が問題なのか分からず困っています。ご回答お願いします。 private void Form1_Load(object sender, EventArgs e) {   this.AllowDrop = true;   ListBox1.AllowDrop = true; } private void ListBox1_DragEnter(object sender,System.Windows.Forms.DragEventArgs e) {   e.Effect = DragDropEffects.Copy; } private void ListBox1_DragDrop(object sender,System.Windows.Forms.DragEventArgs e) {   string[] fileName =(string[])e.Data.GetData(DataFormats.FileDrop, false);   ListBox1.Items.AddRange(fileName); }

  • ファイルをドラッグドロップでTextBooxにファイル名を出したい

    下記のサンプルコードをWEBサイトで見つけたので ListBox1というところをTextBox1と直して テキストボックスにファイルのフルパスが出るように したかったのですが、Listbox1だと正常なのですが、 TextBox1に変更すると動作しなくなってしまいます。 最後の部分の ListBox1.Items.AddRange(e.Data.GetData(DataFormats.FileDrop))は TextBox1.Text=e.Data.GetData(DataFormats.FileDrop) に変更してあります。 正常に動作するにはどこを直したらよいか教えて頂きたいです。 宜しくお願いします。m(__)m --------------------------------------------------- Private Sub ListBox1_DragEnter(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DragEventArgs) _ Handles ListBox1.DragEnter '関連連づけの確認をしています。 'この場合、ドラッグアンドドロップの形式であるかどうか? If e.Data.GetDataPresent(DataFormats.FileDrop) Then 'ドロップ効果を取得 e.Effect = DragDropEffects.Copy Else 'ドロップ効果を破棄 e.Effect = DragDropEffects.None End If End Sub Private Sub ListBox1_DragDrop(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DragEventArgs) _ Handles ListBox1.DragDrop 'DragEnterイベントで、取得した情報を追加 ListBox1.Items.AddRange(e.Data.GetData(DataFormats.FileDrop)) End Sub

  • C# listbox

    どうしても解らないのでご教授お願いたします. やりたいことは単純なのですが,リストボックスにドラックドロップしたときに表示する フォント(文字の色とサイズ)を変更したいのですが,下記のプログラムではドラッグドロップ するとリストが真っ白になってしまいます.いろいろ調べたのですが何が原因が解りません. 何卒よろしくお願いいたします. private void listBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) { listBox1.Items.Clear(); listBox1.DrawMode = DrawMode.OwnerDrawVariable; //コントロール内にドロップされたとき実行される //ドロップされたすべてのファイル名を取得する string[] fileName = (string[])e.Data.GetData(DataFormats.FileDrop, false); //ListBoxに追加する listBox1.Items.AddRange(fileName); listBox1.Sorted = true; } private void listBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) { //コントロール内にドラッグされたとき実行される if (e.Data.GetDataPresent(DataFormats.FileDrop)) { //ドラッグされたデータ形式を調べ、ファイルのときはコピーとする e.Effect = DragDropEffects.Copy; } else { //ファイル以外は受け付けない e.Effect = DragDropEffects.None; } } //DrawItemイベントハンドラ //項目を描画する private void ListBox1_DrawItem(object sender,System.Windows.Forms.DrawItemEventArgs e) { //背景を描画する Font cfont = new Font("MS P明朝", 9, FontStyle.Bold); //適切な色で背景を描画する。 e.DrawBackground(); Rectangle rec = e.Bounds; Graphics g = e.Graphics; Color col = Color.Black; Font deffont = e.Font; deffont = cfont; string txt = ((ListBox)sender).Items[e.Index].ToString(); TextRenderer.DrawText(g, txt, deffont, rec, col, TextFormatFlags.Default); }

  • ドラッグ&ドロップの対象をフォルダに限定したい

    こんばんは。 テキストボックスにドラッグ&ドロップされたフォルダのパスを取得させたいのですがドラッグの対象をフォルダに限定させたい、もしくはファイルがドラッグ&ドロップされたらそのファイルのカレントディレクトリまでのパスを取得させたいのですが、下記のコードでは取得までは出来るのですがファイルがきた場合にファイルまでのパスが取得されてしまいまいます。 よろしくお願いします。 Dim ddpath As String Private Sub TxtPath_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TxtPath.DragEnter If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.Copy Else e.Effect = DragDropEffects.None End If End Sub Private Sub TxtPath_DragDrop(ByVal sender As Object, ByVal e As _System.Windows.Forms.DragEventArgs) Handles TxtPath.DragDrop ddpath = e.Data.GetData(DataFormats.FileDrop)(0) If Dir(ddpath, FileAttribute.Directory) <> "" Then TxtPath.Text = ddpath End If End Sub

  • 【C# 2010】 テキストへのドラック&ドロップ

    VisualStudio C#2010 Express の環境で、テキストボックスにエクスプローラからフォルダを指定(複数)して、ドラック&ドロップすると、そのフォルダのフルパスをテキストボックスへ表示させるアプリケーションを作成しております。 調べながら作成し、フォルダのフルパスをテキストボックスへ表示させられるようになったのですが、わからない点として、複数のフォルダを指定しても、テキストボックスに表示されるのは1フォルダ分のフルパスだけになってしまうという点です。 テキストボックス側のプロパティで、複数行で表示させる設定(Multiline)は有効(True)にしてありますし、ユーザーがドラックしたデータを受け入れるかの設定(AllDrop)も有効にしてあります。 その他、気づいた点として、☆ ドロップイベントの配列(pass)には指定したフォルダ分のフルパスが格納されていますが、textbox1.Text = pass[i] の部分で全てのフルパスがテキストに表示されません。 原因を考えましたが、どうしてもわからなかったので、どなたかお分かりになられる方がいらっしゃい ましたら、ご教授のほどお願いできますでしょうか? 何卒、よろしくお願いいたします。 ----------------------------------------------------------------------------- public Form1() { InitializeComponent(); this.textBox1.DragDrop += new System.Windows.Forms.DragEventHandler(this.textBox1_DragDrop); this.textBox1.DragEnter += new System.Windows.Forms.DragEventHandler(this.textBox1_DragEnter); } // ☆ ドラッグイベント private void textBox1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.All; else e.Effect = DragDropEffects.None; } // ☆ ドロップイベント private void textBox1_DragDrop(object sender, DragEventArgs e) { string[] pass = (string[])e.Data.GetData(DataFormats.FileDrop, false); int i; for (i = 0; i < pass.Length; i++) { textBox1.Text = pass[i]; } }

  • D&Dでファイルパスを取得

    フォームにD&Dでファイルパスを取得する プログラムを作ろうと思っているのですが、うまくいきません。 ファイルをフォームにドラッグしても禁止マークがでて イベントハンドラがイベントをキャッチしてくれないようです。 なにが問題かアドバイスを頂けないでしょうか? よろしくお願いします。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.AllowDrop = True End Sub Private Sub Form1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.Copy End If End Sub Private Sub Form1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop Dim FileName As String FileName = e.Data.GetData(DataFormats.FileDrop)(0) MsgBox(FileName) End Sub End Class ---- 開発環境:VS2005 pro OS:WindowsVista

  • ドラッグドロップ(AllowDrop)について

    Form1にドラッグドロップ機能を導入しようと思い AllowDropプロパティをTrueにしてDragDropイベントとDragEnterイベントを記述しました。 実際にデバックしてみるとうまく機能して安心したのですが 後で、bin/debug/AAA.exeを直接クリックしてみるとなぜか機能しません。 MyBase.LoadイベントにMyBase.AllowDrop=Trueと記述してみたいのですがダメでした。 何か設定が間違ってるのでしょうか? ぜひご回答お願いします。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load   MyBase.AllowDrop = True End Sub Private Sub drag_drop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop   Dim list As String() = CType(e.Data.GetData(DataFormats.FileDrop, False), String())   For Each a In list      MsgBox(a)   Next End Sub Private Sub drag_enter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter   e.Effect = DragDropEffects.Copy End Sub

  • VC# 追加フォーム生成時、フォームに描画できない

    前略 ・VC#(.NET 2008)のプログラムでおしえてください。 ・メインのWindowsフォームからボタンクリックで 追加したサブWindowsフォーム上のピクチャーボックス上に何も操作なしでに描画したいのですができません。CreateGraphics()でオブジェクトを生成して描画しています。どのようにしたらよいのかおしえてください。フォームのイベントとして、Paint,Load,shown,Activated等いろいろやってもだめでした。  尚、サブフォームにボタンをもうけ このメソッドの中に描画コマンドを書き、ボタンを操作すると描画できます。下記は円を描こうとしていますが、shapeコンポーネントでは描けな複雑な描画をしたいと思っています。 ・以下に 下記の動作となるソースコードを記載します。 (1)起動するとメインフォームForm1のpictureBox1に 赤い円が描かれる (2)ボタンbutton1をクリックするとForm2が表示される。  Form2上のラベルlabel1とlabel2の文字色は青色に変わっています。  しかし、円は何故か描かれていません (3)Form2上のボタンをクリックすると赤い円がForm2上に描かれます。  どこをどのように直せば追加のサブフォームForm2が表示された時に Form2上のpictureBox1に円が描がかれているのでしょうか。以上、よろしくお願いします //----------------------------------------------------------- //メインフォーム using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace temp2 { public partial class Form1 : Form { public Form1(){ InitializeComponent(); } private void button1_Click(object sender, EventArgs e){ Form2 form2 = new Form2(); form2.ShowDialog(); } private void Form1_Paint(object sender, PaintEventArgs e){ Graphics g = pictureBox1.CreateGraphics(); g.DrawEllipse(Pens.Red, 0, 0, 200, 200); } } } //サブフォーム using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace temp2 { public partial class Form2 : Form { public Form2(){ InitializeComponent(); } private void pictureBox1_Paint(object sender, PaintEventArgs e){ label1.ForeColor = Color.Blue; Graphics g1 = pictureBox1.CreateGraphics(); g1.DrawEllipse(Pens.Blue, 0, 0, 50, 50); label2.ForeColor = Color.Blue; } private void button1_Click(object sender, EventArgs e){ Graphics g2 = pictureBox1.CreateGraphics(); g2.DrawEllipse(Pens.Blue, 0, 0, 50, 50); } private void Form2_Paint(object sender, PaintEventArgs e){ } private void Form2_Load(object sender, EventArgs e){ } private void Form2_Shown(object sender, EventArgs e){ } } } 以上

  • VC#でドラッグアンドドロップ時のカーソルの制御

    プログラミング初心者です。 ファイル管理ソフトを作りたいなと、種々の言語を比較した結果VC#が一番やりやすいかなと思い、基礎知識もなくvisual studioをインストールしてあれこれ試行錯誤しながら、メニューやボタンやリストビューを作るところまでは行きました。ドラッグアンドドロップ機能を付けたいと思い、色々と検索してドラッグアンドドロップでlistView1に特定の拡張子のファイルを入れる下記のコードは見つかりました。さらに、特定の拡張子(ここでは.txt)以外のファイルをドラッグしてlistView1の領域に入った時、カーソルを禁止のマークに変えたいのですがそのコードがわかりません。ご教授いただければと存じます。 // もちろん基礎知識も平行して勉強しているところです。 // 下記のlistView1_DragEnterイベントハンドラ内に // if(ドラッグしたファイルの拡張子が.txt以外だったら){Cursor.Current = Cursors.No;} // とすると思い色々試したのですがうまくいきませんでした。(素人の試行錯誤なので提示できません) private void listView1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Link; } } private void listView1_DragDrop(object sender, DragEventArgs e) { string[] handles = (string[])e.Data.GetData(DataFormats.FileDrop, false); foreach (string s in handles) { if (File.Exists(s)) { if (string.Compare(Path.GetExtension(s), ".txt", true) == 0) { AddFileToListview(s); } } else if (Directory.Exists(s)) { DirectoryInfo di = new DirectoryInfo(s); FileInfo[] files = di.GetFiles("*.txt"); foreach (FileInfo file in files) AddFileToListview(file.FullName); } } } private void AddFileToListview(string fullFilePath) { if (!File.Exists(fullFilePath)) return; string fileName = Path.GetFileNameWithoutExtension(fullFilePath); string dirName = Path.GetDirectoryName(fullFilePath); if (dirName.EndsWith(Convert.ToString(Path.DirectorySeparatorChar))) dirName = dirName.Substring(0, dirName.Length - 1); //hack off the trailing \ ListViewItem itm = listView1.Items.Add(fileName); itm.SubItems.Add(dirName); //second column = path }

  • VC++2005 windowsフォームアプリでドラッグ&ドロップを実現する方法

    お世話になっております。 表題についていろいろ調べたのですがエラーの解決方法が見つからないため、質問させてください。 環境はVC++2005 CLD windowsフォームアプリケーション です。 貼り付けたリストボックスにtxtファイルをドラッグドロップして中身を取り出したいのですが、dragdrop関数内で、ファイルのパスを抜き出す部分でエラーが解決できません。 環境に合わせて下記のようなdragdrop関数を作成中です。 System::Void Form1::commandListBox_DragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) { if(e ->Data ->GetDataPresent(DataFormats::FileDrop)){ // ファイルドロップのとき std::string files[] = (std::string[])(e->Data->GetData(DataFormats::FileDrop)); } } 最後の行はMSDNなどで書かれていた string[] files = (string[])(e.Data.GetData(DataFormats.FileDrop)); となっている部分を参考にしているつもりですが、この部分で下記のエラーがでます。 1>.\mySrc\tab0.cpp(45) : error C2440: '型キャスト' : 'System::Object ^' から 'std::string []' に変換できません。 1> 配列型への変換はありませんが、参照またはポインタから配列への変換があります。 1>.\mySrc\tab0.cpp(45) : error C2075: 'files' : 配列の初期化には中かっこ ({}) が必要です。 このエラーの解決方法か、ドラッグドロップしたファイルのパスを取得する方法をご教授頂ければ幸いでございます。 よろしくお願いいたします。

専門家に質問してみよう