宇宙仮面の
C# Programming

 
Image

ImageViewerを作る。(その1)


開発環境: Visual Studio 2003
次のような機能のForm アプリケーションを作る。
  • メニューから、画像ファイルを表示する。
  • ファイルサイズに合わせて、ウィンドウをリサイズする。
  • ウィンドウ自体は、リサイズできない。
Image

See NASA Copyright Notification

作り方

手順説明
1Form のプロパティをセットする。FormBorderStyle は、リサイズできないように Fixed3Dにする。
2メニューを追加する。Image

メニューの開くのEventHandler で、OpenFileDialog を呼び出す。
メニューの終了は、Close()を呼び出す。
ヘルプとバージョン情報を追加しておく。
3画像表示用のPictureBox を貼り付ける。ツールボックスからPictureBox を貼り付ける。
サイズは画像に合わせてリサイズするので、適当でよい。
Dock プロパティは None のまま、Anchor も Left, Top のままにしておく。
4画像表示時のイベント処理を追加する。OnPaint イベント処理発生時に、DrawImage を呼ぶようにする。
5DrawImageを追加する。Bitmap(FileName) でビットマップを作成し、Graphics.DrawImage(bitmap) で描画する。
SetClientSizeCore(...)を呼び、自動的にウィンドウを画像のサイズにリサイズする。
6About,cs ダイアログの追加。ソリューションエクスプローラで、Form を1つ(About.cs)追加する。
メニューのバージョン情報をダブルクリックして、Aboutフォームを表示するようにする。
7About ダイアログに、リンクラベルを追加する。リンクラベルのText には、"http://ukamen.hp.infoseek.co.jp/"をセットする。
デザイナで、リンクラベルをダブルクリックして、LinkClicked イベントハンドラを追加し、
次のようにブラウザを起動するコードを書く。

private void linkLabel1_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start(((LinkLabel)sender).Text);
}
OpenFileDialog の表示例
Image

以下、ソースコード

日付修正履歴
2003/12/8VS.2003、.NET Framework V1.1 に対応
2002/4/28PictureBox に変更、全画像が表示されないバグを修正。
2002/3/5初期バージョン作成


ImageBrowser.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace ImageBrowser
{
        /// <summary>
        /// Form1 の概要の説明です。
        /// </summary>
        public class ImageViewer : System.Windows.Forms.Form
        {
                private System.Windows.Forms.MainMenu mainMenu1;
                private System.Windows.Forms.MenuItem menuOpen;
                private System.Windows.Forms.MenuItem menuFile;
                private System.Windows.Forms.MenuItem menuClose;
                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;
                private System.Windows.Forms.PictureBox pictureBox1;
                private System.Windows.Forms.MenuItem menuItem1;
                private System.Windows.Forms.MenuItem menuItem2;
                private string fileName = null;

                public ImageViewer()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();

                        //
                        // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
                        //
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if (components != null) 
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要です。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        this.menuClose = new System.Windows.Forms.MenuItem();
                        this.menuOpen = new System.Windows.Forms.MenuItem();
                        this.menuFile = new System.Windows.Forms.MenuItem();
                        this.mainMenu1 = new System.Windows.Forms.MainMenu();
                        this.pictureBox1 = new System.Windows.Forms.PictureBox();
                        this.menuItem1 = new System.Windows.Forms.MenuItem();
                        this.menuItem2 = new System.Windows.Forms.MenuItem();
                        this.SuspendLayout();
                        // 
                        // menuClose
                        // 
                        this.menuClose.Index = 1;
                        this.menuClose.Text = "終了(&X)";
                        this.menuClose.Click += new System.EventHandler(this.OnClose);
                        // 
                        // menuOpen
                        // 
                        this.menuOpen.Index = 0;
                        this.menuOpen.Text = "開く(&O)";
                        this.menuOpen.Click += new System.EventHandler(this.OnMenuOpen);
                        // 
                        // menuFile
                        // 
                        this.menuFile.Index = 0;
                        this.menuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                                                                                                                         this.menuOpen,
                                                                                                                                                                         this.menuClose});
                        this.menuFile.Text = "ファイル(&F)";
                        // 
                        // mainMenu1
                        // 
                        this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                                                                                                                          this.menuFile,
                                                                                                                                                                          this.menuItem1});
                        // 
                        // pictureBox1
                        // 
                        this.pictureBox1.Name = "pictureBox1";
                        this.pictureBox1.Size = new System.Drawing.Size(208, 142);
                        this.pictureBox1.TabIndex = 0;
                        this.pictureBox1.TabStop = false;
                        this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.OnPaint);
                        // 
                        // menuItem1
                        // 
                        this.menuItem1.Index = 1;
                        this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                                                                                                                          this.menuItem2});
                        this.menuItem1.Text = "ヘルプ(&H)";
                        // 
                        // menuItem2
                        // 
                        this.menuItem2.Index = 0;
                        this.menuItem2.Text = "バージョン情報(&A)";
                        this.menuItem2.Click += new System.EventHandler(this.OnAbout);
                        // 
                        // ImageViewer
                        // 
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.ClientSize = new System.Drawing.Size(292, 245);
                        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                                                                                                  this.pictureBox1});
                        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
                        this.Menu = this.mainMenu1;
                        this.Name = "ImageViewer";
                        this.Text = "ImageViewer";
                        this.ResumeLayout(false);

                }
                #endregion

                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main() 
                {
                        Application.Run(new ImageViewer());
                }

                private void OnMenuOpen(object sender, System.EventArgs e)
                {
                        OpenFileDialog openFileDialog1 = new OpenFileDialog();

                        openFileDialog1.InitialDirectory = "c:\\" ;
                        openFileDialog1.Filter = "JPEG files (*.jpg)|*.jpg|GIF files (*.gif)|*.gif|Bitmap files (*.bmp)|*.bmp|All files (*.*)|*.*" ;
                        openFileDialog1.FilterIndex = 1 ;
                        openFileDialog1.RestoreDirectory = true ;

                        if(openFileDialog1.ShowDialog() == DialogResult.OK)
                        {
                                fileName = openFileDialog1.FileName;
                                this.pictureBox1.Invalidate();
                        }
                }

                private void DrawImage(Graphics g)
                {
                        try 
                        {       
                                Bitmap myBitmap = new Bitmap( fileName );
                                this.pictureBox1.Width = myBitmap.Width;
                                this.pictureBox1.Height = myBitmap.Height;
                                // Fit form to the image size.
                                this.SetClientSizeCore(this.pictureBox1.Width, this.pictureBox1.Height);

                                g.DrawImage( myBitmap, this.ClientRectangle );
                        } 
                        catch ( System.ArgumentException e)
                        {
                                MessageBox.Show(e.Message + "\n画像ファイルを選択してください。", this.Text,
                                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                }

                private void OnClose(object sender, System.EventArgs e)
                {
                        Close();
                }

                private void OnPaint(object sender, System.Windows.Forms.PaintEventArgs e)
                {
                        if ( fileName != null ) 
                                DrawImage(e.Graphics);
                }

                private void OnAbout(object sender, System.EventArgs e)
                {
                        ImageBrowser.About about = new ImageBrowser.About();
                about.ShowDialog();
                }
        }
}
About.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace ImageBrowser
{
    /// <summary>
    /// About の概要の説明です。
    /// </summary>
    public class About : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.LinkLabel linkLabel1;
        /// <summary>
        /// 必要なデザイナ変数です。
        /// </summary>
        private System.ComponentModel.Container components = null;

        public About()
        {
            //
            // Windows フォーム デザイナ サポートに必要です。
            //
            InitializeComponent();

            //
            // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
            //
        }

        /// <summary>
        /// 使用されているリソースに後処理を実行します。
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows フォーム デザイナで生成されたコード 
        /// <summary>
        /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディタで変更しないでください。
        /// </summary>
        private void InitializeComponent()
        {
            this.label1 = new System.Windows.Forms.Label();
            this.linkLabel1 = new System.Windows.Forms.LinkLabel();
            this.SuspendLayout();
            // 
            // label1
            // 
            this.label1.Location = new System.Drawing.Point(16, 16);
            this.label1.Name = "label1";
            this.label1.TabIndex = 0;
            this.label1.Text = "ImageViewer V1.1";
            // 
            // linkLabel1
            // 
            this.linkLabel1.Location = new System.Drawing.Point(64, 56);
            this.linkLabel1.Name = "linkLabel1";
            this.linkLabel1.Size = new System.Drawing.Size(256, 23);
            this.linkLabel1.TabIndex = 1;
            this.linkLabel1.TabStop = true;
            this.linkLabel1.Text = "http://ukamen.hp.infoseek.co.jp/";
            this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
            // 
            // About
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
            this.ClientSize = new System.Drawing.Size(368, 86);
            this.Controls.Add(this.linkLabel1);
            this.Controls.Add(this.label1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "About";
            this.Text = "About";
            this.ResumeLayout(false);

        }
        #endregion

        private void linkLabel1_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
        {                
            System.Diagnostics.Process.Start(((LinkLabel)sender).Text);
        }
    }
}