画像に合わせてサイズを設定する



MoveWindow() でウインドウのサイズを BMP 画像の大きさに合わせて表示します。

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

プロジェクトの設定

  1. 表示する BMP 画像を用意して下さい。
    原則的に BMP 画像であれば何でも良いのですが、縦横共に300ピクセル程度の24ビット形式が良いでしょう。
  2. 新規プロジェクト(Bmp)を作成して「// グローバル変数 :」の位置までスクロールして下さい。
    プロジェクトの作成は Windows プログラムを自動的に作成する を参照して下さい。
    画面に表示する画像の「幅と高さ」を調べて記憶する領域を定義します。
        // グローバル変数 :
        HINSTANCE hInst;
        TCHAR     szTitle[MAX_LOADSTRING];
        TCHAR     szWindowClass[MAX_LOADSTRING];
        long      BMP_W, BMP_H;
        
  3. BMP 画像の描画に関係する関数を定義します。
        // このコード モジュールに含まれる関数の宣言を転送します :
        ATOM                MyRegisterClass(HINSTANCE hInstance);
        BOOL                InitInstance(HINSTANCE, int);
        LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
        LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
        void                GetBMPSize();
        void                ShowBMP(HDC hdc);
        void                Adjust_Win(HWND hWnd);
    
        //★ リソース("IDB_BITMAP1")から画像サイズを取得する
        void GetBMPSize()
        {
            HBITMAP     hBitmap;
            BITMAP      bmp;
    
            hBitmap = LoadBitmap(hInst,"IDB_BITMAP1");
            if (hBitmap==NULL)
            {   OutputDebugString("Load BMP Error\n");
                return;
            }
            GetObject(hBitmap,sizeof(BITMAP),&bmp);
            BMP_W = bmp.bmWidth;
            BMP_H = bmp.bmHeight;
            DeleteObject(hBitmap);
            return;
        }
    
        //★ リソース("IDB_BITMAP1")から画像を入力して画面に描画する
        void ShowBMP(HDC hdc)
        {
            HDC         hmdc;
            HBITMAP     hBitmap;
    
            hBitmap = LoadBitmap(hInst,"IDB_BITMAP1");
            hmdc = CreateCompatibleDC(hdc);
            SelectObject(hmdc, hBitmap);
            BitBlt(hdc,0,0,BMP_W,BMP_H,hmdc,0,0,SRCCOPY);
            DeleteDC(hmdc);
            DeleteObject(hBitmap);
            return;
        }
    
        //★ Window Size を画像に合わす
        void    Adjust_Win(HWND hWnd)
        {   RECT    rc;
            int     x,y;
    
            GetWindowRect(hWnd, &rc);
            x= rc.left;
            y= rc.top;
            rc.right= x + BMP_W;
            rc.bottom= y + BMP_H;
            AdjustWindowRect(&rc,WS_OVERLAPPEDWINDOW,TRUE);
            MoveWindow(hWnd,x,y,rc.right-rc.left,rc.bottom-rc.top,TRUE);
        }
        
  4. WndProc() に WM_CREATE: を追加します。
    ここから画像のサイズを取得して、ウインドウの大きさを設定する関数を呼び出します。
        switch (message)
        {   case WM_CREATE:
                GetBMPSize();
                Adjust_Win(hWnd);
                break;
        
  5. WM_PAINT に画像を表示するコードを追加します。
    画像の描画は ShowBMP() 関数を呼ぶだけです。
            case WM_PAINT:
                hdc = BeginPaint(hWnd, &ps);
                // TODO: 描画コードをここに追加してください...
                ShowBMP(hdc);
                EndPaint(hWnd, &ps);
                break;
        
  6. BMP 画像をリソースとして取り込みます。
  7. [デバッグ]を選択してビルドに続いて実行を行います。
    画像のサイズに合わせて BMP 画像が表示されたら完成です。

プログラムの説明

  1. GetBMPSize() はリソースとして取り込まれた画像のサイズを調べる関数です。
    LoadBitmap() でリソースの画像情報を取得します。
    画像情報の取得に失敗したとき OutputDebugString() でエラー表示をします。
    OutputDebugString() はデバッグモードで実行したときに「エラー表示ウインドウ」に表示されるメッセージで 通常モードで実行したときは無視されます。
          hBitmap = LoadBitmap(hInst,"IDB_BITMAP1");
          if (hBitmap==NULL)
          {   OutputDebugString("Load BMP Error\n");
              return;
          }
        
  2. Adjust_Win() では現在のウインドウサイズを取得して BMP 画像に合わせてウインドウサイズを変更します。
    GetWindowRect() が現在のウインドウサイズを取得する関数で、MoveWindow() がサイズを変更する関数です。
          GetWindowRect(hWnd, &rc);
          MoveWindow(hWnd,x,y,rc.right-rc.left,rc.bottom-rc.top,TRUE);
        
  3. ShowBMP() がリソースとして取り込まれた画像を表示する関数です。
    ・LoadBitmap() でリソースの画像情報を取得して
    ・コンパティブルなデバイスコンテキストを作成して
    ・デバイスコンテキストに画像をロードして
    ・BitBlt() で描画します
    面倒な手順ですが Windows で画像を描画するときの標準的な方法です。
  4. 関数内で割り当てた HDC, HBITMAP などは用が済めば開放するのがルールです。
          hBitmap = LoadBitmap(hInst,"IDB_BITMAP1");
          hmdc = CreateCompatibleDC(hdc);
          SelectObject(hmdc, hBitmap);
          BitBlt(hdc,0,0,BMP_W,BMP_H,hmdc,0,0,SRCCOPY);
        

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