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

矢印キーで上下左右に画像を移動します。
画像を描画する IMAGE Class を使ってみました。

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

プログラムの説明

  1. 空のプロジェクトを作成して、ソースプログラムをプロジェクトに取り込んで下さい。
    OnKeyDown() をオーバーライドして、キーの押し下げを検出します。
    1. Escape のときプログラムを終了します。
    2. 下矢印キーのとき、画像を下に移動します。
    3. 上矢印キーのとき、画像を上に移動します。
    4. 右矢印キーのとき、画像を右に移動します。
    5. 左矢印キーのとき、画像を左に移動します。
  2. ソースコードです。
    /*★ 矢印キーで画像を操作    前田 稔 ★*/
    #using <System.dll>
    #using <System.Windows.Forms.dll>
    #using <System.Drawing.dll>
    
    using namespace System;
    using namespace System::Windows::Forms;
    using namespace System::Drawing;
    
    //画像を表示するクラス
    ref class IMAGE
    {
      public:
        Bitmap^ bmp;
    
        IMAGE(String^ file)
        {
            try
            {   bmp = gcnew Bitmap(file);  }
            catch(Exception^ e)
            {   Console::WriteLine(e->Message);
                MessageBox::Show("イメージが取得できません", "Error");
            }
        }
    
        void View(Graphics^ g, int x, int y)
        {
            if (bmp!=nullptr)  g->DrawImage(bmp,x,y);
        }
    };
    
    ref class FormClass : public System::Windows::Forms::Form
    {
      private:
        IMAGE^  App;
        int     xp,yp;
    
      public:
        FormClass()
        {
            this->Width = 600;
            this->Height = 400;
            App = gcnew IMAGE("c:\\data\\test\\kishi.gif");
            xp = yp = 100;
            Paint += gcnew PaintEventHandler(this, &FormClass::MyHandler);
        }
    
        void MyHandler(Object^ sender, PaintEventArgs^ e)
        {
            Graphics^ g = e->Graphics;
            if (App->bmp == nullptr) Application::Exit();
            App->View(g,xp,yp);
        }
    
        virtual void OnKeyDown(KeyEventArgs^ e) override 
        {
            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();
        }
    };
    
    int main()
    {
        Application::Run(gcnew FormClass());
        return 0;
    }
    
  3. class IMAGE がイメージを描画する Class です。
    Constructor で画像ファイルの名前を受け取って bmp にロードします。
    ロードに失敗したときは MessageBox で知らせます。
    このとき bmp には null が格納されています。
    このタイミングで Application.Exit(); が効けば良いのですが、Constructor の中では効かないようです。
        IMAGE(String^ file)
        {
            try
            {   bmp = gcnew Bitmap(file);  }
            catch(Exception^ e)
            {   Console::WriteLine(e->Message);
                MessageBox::Show("イメージが取得できません", "Error");
            }
        }
    
  4. View() メソッドでは、画像のロードを確認して x,y の座標から画像を描画します。
        void View(Graphics^ g, int x, int y)
        {
            if (bmp!=nullptr)  g->DrawImage(bmp,x,y);
        }
    
  5. xp, yp はキーで操作する画像の座標です。
    MyForm の Constructor で、ウインドウの幅と高さを設定します。
    次に、画像ファイルの名前を指定して IMAGE クラスをインスタンス化します。
    "c:\\data\\test\\kishi.gif" が画像ファイルの名前です。
        IMAGE^  App;
        int     xp,yp;
    
        FormClass()
        {
            this->Width = 600;
            this->Height = 400;
            App = gcnew IMAGE("c:\\data\\test\\kishi.gif");
            xp = yp = 100;
            Paint += gcnew PaintEventHandler(this, &FormClass::MyHandler);
        }
    
  6. MyHandler() で、画像を描画します。
    画像のロードに失敗したときは App.bmp が null になっています。
        void MyHandler(Object^ sender, PaintEventArgs^ e)
        {
            Graphics^ g = e->Graphics;
            if (App->bmp == nullptr) Application::Exit();
            App->View(g,xp,yp);
        }
    
  7. キーが押されたときの処理です。
    Escape でプログラムを終了します。
    矢印キーで画像を移動します。
        virtual void OnKeyDown(KeyEventArgs^ e) override 
        {
            switch(e->KeyCode)
            {   case Keys::Escape:
                    Application::Exit();
                    break;
                case Keys::Down:
                      ・・・
            }
            Invalidate();
        }
    }
    
  8. C#でも キー操作で画像を移動する を作成しています。
    ☆C#とC++/CLI との違いを学んで下さい。
    画像の描画エトセトラは 画像描画 etc を参照して下さい。

タイトルバーに表示

  1. 画像を描画する座標をタイトルバーに表示します。
    MyHandler から直接タイトルバーに表示することも出来るのですが、今回は VarMsg() 関数を定義して使います。
    後位参照が起こらないように FormClass() の Constructor の直後にでも置いて下さい。
        void VarMsg(String^ msg, int x, int y)
        {   String^ message = msg + " " + x + " " + y;
            this->Text = message;
        }
    
  2. MyHandler で App->View() に続いて VarMsg("Position= ", xp, yp) を呼び出します。
        void MyHandler(Object^ sender, PaintEventArgs^ e)
        {
            Graphics^ g = e->Graphics;
            if (App->bmp == nullptr) Application::Exit();
            App->View(g,xp,yp);
            VarMsg("Position= ", xp, yp);
        }
    
  3. 矢印キーをタイプすると、画像が移動すると共に、座標がタイトルバーに表示されます。

超初心者のプログラム入門(C/C++)