画像ファイルを選択

画像ファイルを選択して描画するメニューを設定します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 空のプロジェクトから Form を作成して下さい。
    詳細は Form を作成する を参照して下さい。
  2. メインメニューを生成して、画像を入力するファイルメニューを追加します。
    FileOpen が「画像ファイルを選択」するイベントハンドラです。
    item.MenuItems.Add("-"); はメニューの区切りの横線です。
    次に終了メニューを追加します。
    メニューをフォームに登録します。
    メニュー設定の詳細は メニューを設定する を参照して下さい。
        // メインメニューを生成
        MainMenu menu = new MainMenu();
    
        // ファイル/開くメニューを生成
        MenuItem item = menu.MenuItems.Add("ファイル(&F)");
        item.MenuItems.Add(new MenuItem("開く(&O)...", new EventHandler(this.FileOpen)));
        item.MenuItems.Add("-");
    
        // ファイル/終了メニューを生成
        item.MenuItems.Add(new MenuItem("終了(&X)", new EventHandler(this.FileExit), Shortcut.CtrlQ));
    
        // フォームのメニューとしてセット
        this.Menu = menu;
        
  3. 「画像ファイルを選択」する FileOpen イベントハンドラです。
    OpenFileDialog を使って画像ファイルを選択します。
    OpenFileDialog の説明は 前田稔の超初心者のプログラム入門 から 「C言語 Windows/BMP ファイルを選択する」を参照して下さい。
    画像ファイルの選択が終わると Invalidate(); でウインドウを再描画します。
        // ファイル/開くメニューのイベントハンドラ
        private void FileOpen(object sender, EventArgs e)
        {
            OpenFileDialog opendlg = new OpenFileDialog();
            opendlg.Filter = "画像ファイル (*.jpg)|*.jpg|すべてのファイル (*.*)|*.*" ;
            if (opendlg.ShowDialog() == DialogResult.OK)
            {
                // 選択画像を表示
                ImgFile = opendlg.FileName;
                Invalidate();
            }
        }
        
  4. 入力する画像ファイル名を格納する ImgFile の領域と、画像を描画する MyHandler() メソッドです。
    画像の描画は 画像ファイルを描画する を参照して下さい。
        private string ImgFile = "";
    
        private void MyHandler(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            if (ImgFile!=string.Empty)
                g.DrawImage(new Bitmap(ImgFile), new PointF(10F,10F));
        }
        
  5. OpenFileDialog を使うと、実行時に次のエラーが発生します。
    Message="OLE が呼び出される前に、現在のスレッドが Single Thread Apartment (STA) モードに設定されていなければなりません。
    Main() 関数に [STAThread] を追加して下さい。
        [STAThread]
        public static void Main()
        {
        
  6. CLI の環境で実行可能な完成したプログラムです。
    /*****************************************************************/
    /*★ メニュー選択で、直接ファイルから画像を入力する    前田 稔 ★*/
    /*****************************************************************/
    using System;
    using System.IO;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class MyForm : Form
    {
        //private string ImgFile = "c:\\data\\test\\kishi.jpg";
        private string ImgFile = "";
        public MyForm()
        {
            Paint += new PaintEventHandler(MyHandler);
    
            // メインメニューを生成
            MainMenu menu = new MainMenu();
    
            // ファイルメニューを生成
            MenuItem item = menu.MenuItems.Add("ファイル(&F)");
            item.MenuItems.Add(new MenuItem("開く(&O)...", new EventHandler(this.FileOpen)));
            item.MenuItems.Add("-");
    
            // ファイル(終了)メニューを生成
            item.MenuItems.Add(new MenuItem("終了(&X)", new EventHandler(this.FileExit), Shortcut.CtrlQ));
    
            // フォームのメニューとしてセット
            this.Menu = menu;
        }
    
        private void MyHandler(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            if (ImgFile!=string.Empty)
                g.DrawImage(new Bitmap(ImgFile), new PointF(10F,10F));
        }
    
        // ファイル-開くメニューのイベントハンドラ
        private void FileOpen(object sender, EventArgs e)
        {
            OpenFileDialog opendlg = new OpenFileDialog();
            opendlg.Filter = "画像ファイル (*.jpg)|*.jpg|すべてのファイル (*.*)|*.*" ;
            if (opendlg.ShowDialog() == DialogResult.OK)
            {
                // 選択画像を表示
                ImgFile = opendlg.FileName;
                Invalidate();
            }
        }
    
        // ファイル-終了メニューのイベントハンドラ
        private void FileExit(object sender, EventArgs e)
        {   this.Close();
        }
    }
    
    class image01
    {
        [STAThread]
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    

【NOTE】

自動生成で作成したプロジェクトには [STAThread] が書かれていますが、空のプロジェクトから作成した場合は追加しなければなりません。
OpenFileDialog() は STA モードでなければ呼び出せないようで、C# では規定値が MTA になっています。
アパートメントモデル,  STAThreadの意味は? を参照して下さい。

前田稔(Maeda Minoru)の超初心者のプログラム入門