Path Check

current→指定Path の順にファイルを確認して、エラーのとき直ちに終了します。

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

Main Program の説明

  1. Object Class のヘッダファイル BSprite.h を include して下さい。
    タイマを使うので ID_TIMER を定義します。
    *App は Basic Sprite Object Class の定義です。
    File[] は BMP 画像ファイルの定義です。
    no は描画する Sprite の番号です。
        #include    <windows.h>
        #include    "BSprite.h"
        #define     SAFE_DELETE(p)  { if (p) { delete (p);     (p)=NULL; } }
        #define     ID_TIMER    (WM_APP + 0)
    
        BSprite     *App= NULL;     //Basic Sprite Object Class
        char        File[MAX_PATH]= "girl.bmp";
        int         no= 0;
        
  2. WM_CREATE: ではファイルの Path を確認してエラーのとき直ちに終了します。
    準備ができるとタイマを設定してアニメーションを開始します。
        switch(msg)
        {   case WM_CREATE:
                App= new BSprite(hWnd);
                if (App->Load(File,7,1)==FALSE)
                {   PostMessage(hWnd,WM_CLOSE,0,0);
                    break;
                }
                SetTimer(hWnd,ID_TIMER,200,NULL);
                break;
        
  3. WM_PAINT: では no 番目の Sprite を描画します。
    Show() メンバ関数では、画像が設定されていないときにはそのままリターンしています。
            case WM_PAINT:
                hdc= BeginPaint(hWnd, &ps);
                App->Show(no,100,50);
                EndPaint(hWnd, &ps);
                break;
        
  4. WM_CLOSE: では、タイマを止めて Object を開放します。
            case WM_CLOSE:
                KillTimer(hWnd,ID_TIMER);
                SAFE_DELETE(App);
                DestroyWindow(hWnd);
                break;
        

BSprite Object Class の説明

  1. BSprite Object Class のヘッダファイル(BSprite.h) です。
    #ifndef, #define, #endif でヘッダが重複して取り込まれないようにします。
    詳細は #ifdef で Class を定義 を参照して下さい。
    PathCheck() はファイルのパスをチェックするメンバ関数です。
        //★ Basic Sprite Object Header   前田 稔 ★
        #ifndef _BSprite
        #define _BSprite
    
        #include    <wingdi.h>
               :
    
            int         PathCheck(char path[]);
        };
    
        #endif
        
  2. BSprite Object Class のプログラムファイル(BSprite.cpp) です。
    PathCheck() 関数を追加して下さい。
    最初に current folder にファイルが格納されていないか調べます。
    current に無ければ、指定された folder を調べます。
        // Path のファイルを確認する(-1 のときはエラー)
        int  BSprite::PathCheck(char path[])
        {   char    file[MAX_PATH];
            int     p;
            DWORD   rc;
    
            for(p=strlen(path); p>0 && path[p]!='\\'; p--);
            p++;
            strcpy(file,path+p);
            rc= GetFileAttributes(file);    //カレントフォルダーを調べる
            if (rc!=-1)
            {   strcpy(path,file);
                return rc;
            }
            rc= GetFileAttributes(path);    //path[] のフォルダーを調べる
            return rc;
        }
        
  3. Load() 関数では、ファイルの Path を調べてから画像ファイルを入力します。
    エラーのときは、メッセージを表示して FALSE をリターンします。
        // Load Sprite Image
        HRESULT  BSprite::Load(LPSTR szBitmap, long WN, long HN)
        {   HDC         hdc;
            BITMAP      bmp;
    
            SAFE_DELDC(hBmpDC);
            SAFE_DELOBJ(hBmp);
            if (PathCheck(szBitmap)==-1)
            {   MessageBox(hWnd,"File Not Found",szBitmap,MB_OK);
                return FALSE;
            }
               :
               :
            // ビットファイルからの読み込み
            hBmp= (HBITMAP)LoadImage(NULL,szBitmap,IMAGE_BITMAP,0,0,
                                     LR_LOADFROMFILE|LR_CREATEDIBSECTION);
            if (hBmp==NULL)
            {   MessageBox(hWnd,"Load BMP Error",szBitmap,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;
        }
        

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