Basic Sprite Object Class が完成

Sprite の枚数を再設定する関数と #ifndef を定義して Basic Sprite Object Class の完成です。

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

Main Program の説明

  1. WM_CREATE: では Sprite の並びを指定して画像をロードします。
    5列2行の10枚のカードに切り分けています。
        switch(msg)
        {   case WM_CREATE:
                App= new BSprite(hWnd);
                App->Load(File,5,2);
                break;
        
  2. WM_PAINT: では途中から5列2行のカードを5列4行に切り分けてみました。
            case WM_PAINT:
                hdc= BeginPaint(hWnd, &ps);
                App->Show();
                App->Show(0,200);
                App->Show(0,300,50);
                App->Show(1,400,50);
                App->Show(2,500,50);
                App->SetNum(5,4);
                App->Show(10,300,150);
                App->Show(11,400,150);
                App->Show(12,500,150);
                EndPaint(hWnd, &ps);
                break;
        

全ソースコード

  1. BSprite Object Class のヘッダファイル(BSprite.h) です。
    #ifndef, #define, #endif でヘッダが重複して取り込まれないようにします。
    詳細は #ifdef で Class を定義 を参照して下さい。
    SetNum() は Sprite の枚数を再設定するメンバ関数です。
    SetSize() は Sprite のサイズを再設定するメンバ関数です。
    これらの関数は、画像はそのままで Sprite の切り出し方を変更します。
    //★ Basic Sprite Object Header   2007-01-01  前田 稔 ★
    #ifndef _BSprite
    #define _BSprite
    
    #include    <wingdi.h>
    #pragma     once
    #pragma     comment(lib,"msimg32.lib")
    #define     SAFE_DELDC(p)   { if (p) { DeleteDC (p);   (p)=NULL; } }
    #define     SAFE_DELOBJ(p)  { if (p) { DeleteObject(p); (p)=NULL; } }
    
    class BSprite
    { protected:
        HWND        hWnd;
        HBITMAP     hBmp;               //画像の HBITMAP
        HDC         hBmpDC;             //画像の HDC
        long        WNum;               //横方向の Sprite 枚数
        long        HNum;               //縦方向の Sprite 枚数
        long        SWidth;             //Sprite の幅
        long        SHeight;            //Sprite の高さ
        long        xp,yp;              //座標を計算する作業領域
    
      public:
        long        Width;              //画像の幅
        long        Height;             //画像の高さ
        char        szFile[MAX_PATH];   //オープンするファイル名(パス付き)
    
        BSprite(HWND hWnd);             //Constructor
        ~BSprite();                     //Destructor
        HRESULT     Load(LPSTR szBitmap, long WN=1, long HN=1);
        HRESULT     Show();
        HRESULT     Show(long x, long y);
        HRESULT     Show(long n, long x, long y);
        HRESULT     SetNum(long WN, long HN);
        HRESULT     SetSize(long WSIZ, long HSIZ);
    };
    
    #endif
    
  2. BSprite Object Class のプログラムファイル(BSprite.cpp) です。
    //★ Basic Sprite Object Class   2007-01-01  前田 稔 ★
    #include <Windows.h>
    #include "BSprite.h"
    
    // BSprite Object Class 関数
    // コンストラクタ(オブジェクトの初期化)
    BSprite::BSprite(HWND hwnd)
    {   hWnd= hwnd;
        hBmp= NULL;
        hBmpDC= NULL;
        szFile[0]= '\0';
    }
    
    // デストラクタ(オブジェクトの終了)
    BSprite::~BSprite()
    {   SAFE_DELDC(hBmpDC);
        SAFE_DELOBJ(hBmp);
    }
    
    // Load Sprite Image
    HRESULT  BSprite::Load(LPSTR szBitmap, long WN, long HN)
    {   HDC         hdc;
        BITMAP      bmp;
    
        SAFE_DELDC(hBmpDC);
        SAFE_DELOBJ(hBmp);
    
        // ビットファイルからの読み込み
        hBmp= (HBITMAP)LoadImage(NULL,szBitmap,IMAGE_BITMAP,0,0,
                                 LR_LOADFROMFILE|LR_CREATEDIBSECTION);
        if (hBmp==NULL)
        {   MessageBox(hWnd,szBitmap,"Load BMP Error",MB_OK);
            return FALSE;
        }
    
        WNum= WN;
        HNum= HN;
        hdc= GetDC(hWnd);
        hBmpDC= CreateCompatibleDC(hdc);
        SelectObject(hBmpDC, hBmp);
        GetObject(hBmp,sizeof(BITMAP),&bmp);
        Width = bmp.bmWidth;
        Height = bmp.bmHeight;
        SWidth= Width/WN;
        SHeight= Height/HN;
        ReleaseDC(hWnd,hdc);
        return TRUE;
    }
    
    // 画像全体を描画する
    HRESULT  BSprite::Show()
    {   HDC     hdc;
        if (hBmpDC==NULL)   return FALSE;
        hdc= GetDC(hWnd);
        BitBlt(hdc,0,0,Width,Height,hBmpDC,0,0,SRCCOPY);
        ReleaseDC(hWnd,hdc);
        return TRUE;
    }
    
    // 黒を透明色で描画する
    HRESULT  BSprite::Show(long x, long y)
    {   HDC     hdc;
        if (hBmpDC==NULL)   return FALSE;
        hdc= GetDC(hWnd);
        TransparentBlt(hdc,x,y,Width,Height,hBmpDC,0,0,Width,Height,RGB(0,0,0));
        ReleaseDC(hWnd,hdc);
        return TRUE;
    }
    
    // 画像の番号を指定して BSprite を描画する
    HRESULT  BSprite::Show(long n, long x, long y)
    {   HDC     hdc;
        if (hBmpDC==NULL)   return FALSE;
        if (n>=WNum*HNum)   return FALSE;
        xp= (short)(n%WNum)*SWidth;
        yp= (short)(n/WNum)*SHeight;
        hdc= GetDC(hWnd);
        TransparentBlt(hdc,x,y,SWidth,SHeight,hBmpDC,xp,yp,SWidth,SHeight,RGB(0,0,0));
        ReleaseDC(hWnd,hdc);
        return TRUE;
    }
    
    // Set BSprite Num(Sprite の分割数を変更する)
    HRESULT  BSprite::SetNum(long WN, long HN)
    {   WNum= WN;
        HNum= HN;
        SWidth= Width/WNum;
        SHeight= Height/HNum;
        return  TRUE;
    }
    
    // Set BSprite Size(Sprite Size を変更する)
    HRESULT  BSprite::SetSize(long WSIZ, long HSIZ)
    {   SWidth= WSIZ;
        SHeight= HSIZ;
        WNum= Width/WSIZ;
        HNum= Height/HSIZ;
        return  TRUE;
    }
    
  3. BSprite Object Class で画像を描画する Main Program です。
    /****************************************************/
    /*★ Basic Sprite Object Class のテスト   前田 稔 ★*/
    /****************************************************/
    #define     NAME    "BSprite Class"
    #include    <windows.h>
    #include    "BSprite.h"
    #define     SAFE_DELETE(p)  { if (p) { delete (p);     (p)=NULL; } }
    
    BSprite     *App= NULL;     //Basic Sprite Object Class
    char        File[MAX_PATH]= "c:\\data\\test\\花札5_2.bmp";
    
    //プロトタイプ宣言
    LRESULT  CALLBACK   WndProc(HWND, UINT, WPARAM, LPARAM);
    int      PASCAL     WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
    
    //★ CALLBACK 関数
    LRESULT  CALLBACK  WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {   PAINTSTRUCT ps;
        HDC         hdc;
    
        switch(msg)
        {   case WM_CREATE:
                App= new BSprite(hWnd);
                App->Load(File,5,2);
                break;
            case WM_PAINT:
                hdc= BeginPaint(hWnd, &ps);
                App->Show();
                App->Show(0,200);
                App->Show(0,300,50);
                App->Show(1,400,50);
                App->Show(2,500,50);
                App->SetNum(5,4);
                App->Show(10,300,150);
                App->Show(11,400,150);
                App->Show(12,500,150);
                EndPaint(hWnd, &ps);
                break;
            case WM_DESTROY:
                SAFE_DELETE(App);
                PostQuitMessage(0);
                return 0L;
        }
        return  DefWindowProc(hWnd,msg,wParam,lParam);
    }
    
    //★ Windows Main 関数
    int PASCAL  WinMain(HINSTANCE hInst,HINSTANCE, LPSTR, int)
    {   HWND        hWnd;
        MSG         msg;
    
        WNDCLASS wc = { CS_CLASSDC,WndProc,0L,0L,hInst,NULL,LoadCursor(NULL,IDC_ARROW),
                        (HBRUSH)GetStockObject(LTGRAY_BRUSH),NULL,NAME };
        if (RegisterClass(&wc)==0)    return FALSE;
        hWnd= CreateWindow(NAME,NAME,WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,CW_USEDEFAULT,640,480,
                NULL,NULL,hInst,NULL);
        if (!hWnd)  return FALSE;
    
        ShowWindow(hWnd,SW_SHOWDEFAULT);
        UpdateWindow(hWnd);
        SetFocus(hWnd);
        while (GetMessage(&msg,NULL,0,0))
        {   TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }
    

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