キー操作で画像を移動する

矢印キーで上下左右に画像を移動します。
矢印キーに加えて、Shift+(ADWX)でも操作出来るようにプログラムします。
画像を描画する IMAGE Class を使ってみました。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. 空のプロジェクトを作成して、ソースプログラムをプロジェクトに取り込んで下さい。
    詳細は Form を作成する を参照して下さい。
    ソースコードです。
    /*★ 矢印キーで画像を操作    前田 稔 ★*/
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class MyForm : Form
    {
        IMAGE   App;
        int     xp,yp;
    
        public MyForm()
        {
            this.Width = 600;
            this.Height = 400;
            App = new IMAGE(@"c:\data\test\kishi.gif");
            xp = yp = 100;
            Paint += new PaintEventHandler(MyHandler);
        }
    
        private void MyHandler(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            if (App.bmp == null) Application.Exit();
            App.View(g, xp, yp);
        }
    
        protected override void OnKeyDown(KeyEventArgs e)
        {
            switch(e.KeyCode)
            {   case Keys.Escape:
                    Application.Exit();
                    break;
                case Keys.Down:
                    yp += 2;
                    break;
                case Keys.Up:
                    yp -= 2;
                    break;
                case Keys.Right:
                    xp += 2;
                    break;
                case Keys.Left:
                    xp -= 2;
                    break;
            }
            Invalidate();
        }
    }
    
    //☆ IMAGE Class の定義
    class IMAGE
    {
        public  Bitmap  bmp;
    
        // Constructor
        public IMAGE(string file)
        {
            try
            {   bmp= new Bitmap(file);  }
            catch
            {   MessageBox.Show("イメージが取得できません", "Error");  }
        }
    
        // 画像を描画する View() 関数
        public void View(Graphics g, int x, int y)
        {   if (bmp!=null)  g.DrawImage(bmp,x,y);  }
    }
    
    // form01 Main() 関数
    class form01
    {
        public static void Main()
        {   MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    
  2. OnKeyDown() をオーバーライドして、キーの押し下げを検出します。
    1. Escape のときプログラムを終了します。
    2. 下矢印キーのとき、画像を下に移動します。
    3. 上矢印キーのとき、画像を上に移動します。
    4. 右矢印キーのとき、画像を右に移動します。
    5. 左矢印キーのとき、画像を左に移動します。
  3. class IMAGE がイメージを描画する Class です。
    Image の描画 は説明がまだかも知れませんが、ページの構成上使ってみました。
    Constructor で画像ファイルの名前を受け取って bmp にロードします。
    ロードに失敗したときは MessageBox で知らせます。
    このとき bmp には null が格納されています。
    catch の時に Application.Exit(); が効けば良いのですが、Constructor の中では効かないようです。
        public IMAGE(string file)
        {
            try
            {   bmp= new Bitmap(file);   }
            catch
            {   MessageBox.Show("イメージが取得できません", "Error");  }
        }
    
  4. View() メソッドでは、画像のロードを確認して x,y の座標から画像を描画します。
        public void View(Graphics g, int x, int y)
        {
            if (bmp!=null)  g.DrawImage(bmp,x,y);
        }
    
  5. xp, yp はキーで操作する画像の座標です。
    MyForm の Constructor で、ウインドウの幅と高さを設定します。
    次に、画像ファイルの名前を指定して IMAGE クラスをインスタンス化します。
    @"c:\data\test\kishi.gif" が画像ファイルの名前です。
        IMAGE   App;
        int     xp,yp;
    
        public MyForm()
        {
            this.Width = 600;
            this.Height = 400;
            App = new IMAGE(@"c:\data\test\kishi.gif");
            xp = yp = 100;
            Paint += new PaintEventHandler(MyHandler);
        }
    
  6. MyHandler() で、画像を描画します。
    (App.bmp == null) のときはプログラムを終了します。
    画像のロードに失敗したときは App.bmp が null になっています。
        private void MyHandler(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            if (App.bmp == null) Application.Exit();
            App.View(g, xp, yp);
        }
    
  7. キーが押されたときの処理です。
    Escape でプログラムを終了します。
    矢印キーで画像を移動します。
        protected override void OnKeyDown(KeyEventArgs e)
        {
            switch(e.KeyCode)
            {   case Keys.Escape:
                    Application.Exit();
                    break;
                case Keys.Down:
                      ・・・
            }
            Invalidate();
        }
    }
    
  8. 矢印キーに加えて、Shift+(ADWX)でも操作出来るようにします。
    if (e.Shift == true) で Shift キーが押されているかを調べます。
    Shift キーが押されているときは、ADWX で操作します。
        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (e.Shift == true)
            {
                switch (e.KeyCode)
                {
                    case Keys.X:
                        yp += 2;
                        break;
                    case Keys.W:
                        yp -= 2;
                        break;
                    case Keys.D:
                        xp += 2;
                        break;
                    case Keys.A:
                        xp -= 2;
                        break;
                }
                Invalidate();
                return;
            }
            
            switch(e.KeyCode)
            {   case Keys.Escape:
                  ・・・
    
  9. C/C++ でも キー操作で画像を移動する を作成しています。
    ☆C#とC/C++ との違いを学んで下さい。

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