BMP ファイルを選択する

BMP の場合

VC++ の GetOpenFileName() で BMP 画像を選択して描画します。

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

プロジェクトの設定

  1. テンプレートまたは、空のプロジェクトから作成して下さい。
  2. szFile[] は GetOpenFileName() で選択されたファイル名を格納する領域です。
        char        szFile[MAX_PATH];           //ファイル名(パス付き)
        
  3. GetOpenFileName() を使って BMP ファイルを選択する関数です。
    選択されたファイルのフルパスが szFile[] に格納されます。
        //★ OPENFILENAME 構造体で BMP ファイルを選択する
        LRESULT OpenFile()
        {   OPENFILENAME    ofn;
    
            szFile[0]= 0;
            memset(&ofn,0,sizeof(OPENFILENAME));
            ofn.lStructSize= sizeof(OPENFILENAME);
            ofn.hwndOwner= NULL;
            ofn.lpstrFilter= "bmp(*.bmp)\0*.bmp\0All files(*.*)\0*.*\0\0";
            ofn.lpstrFile= szFile;
            ofn.lpstrFileTitle= NULL;
            ofn.nMaxFile= MAX_PATH;
            ofn.Flags= OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
            ofn.lpstrDefExt= "bmp";
            ofn.lpstrTitle= "ファイルオープン!";
            if (GetOpenFileName(&ofn)!=TRUE)
            {   MessageBox(NULL,"Open File Error","Bmp Open",MB_OK);
                return FALSE;
            }
            return TRUE;
        }
        
  4. szFile[] から 画像を入力して描画する関数です。
    WM_PAINT: から LoadBMP(hWnd,szFile); で呼ばれます。
    LRESULT LoadBMP(HWND hWnd, LPCSTR szBitmap)
    {   HBITMAP     hbmp;
        BITMAP      bmp;
        HDC         hdc,hmdc;
    
        // ビットマップリソースからの読み込み
        hbmp= (HBITMAP)LoadImage(GetModuleHandle(NULL),szBitmap,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
        // ビットファイルからの読み込み
        if (hbmp==NULL)
        {   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  S_FALSE;
        }
    
        hdc= GetDC(hWnd);
        hmdc= CreateCompatibleDC(hdc);
        SelectObject(hmdc, hbmp);
        GetObject(hbmp,sizeof(BITMAP),&bmp);
        BitBlt(hdc,0,20,bmp.bmWidth,bmp.bmHeight,hmdc,0,0,SRCCOPY);
        StretchBlt(hdc,300,50,bmp.bmWidth*2/3,bmp.bmHeight*2/3,hmdc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
        StretchBlt(hdc,500,60,bmp.bmWidth/2,bmp.bmHeight/2,hmdc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
        DeleteDC(hmdc);
        DeleteDC(hdc);
        DeleteObject(hbmp);
        return S_OK;
    }
        
  5. WM_CREATE でファイルを入力して WM_PAINT で描画します。
        switch(msg)
        {   case WM_CREATE:
                OpenFile();
                break;
            case WM_PAINT:
                 hdc= BeginPaint (hWnd, &ps);
                 LoadBMP(hWnd,szFile);
                 EndPaint(hWnd, &ps);
                 break;
        
  6. Windows 10 でも W32 OpenFile で BMP 画像を選択して描画します。

【演習】

  1. プログラムを完成させて下さい。
  2. TEXT の時に比べて OPENFILENAME 構造体の設定の違いを調べて下さい。

【メモ】

  1. Object Class などで使用した時に OPENFILENAME が未定義になるエラーが発生しています。
    そのときは commdlg.h をインクルードして下さい。
        #include <commdlg.h>
    
            OPENFILENAME    ofn;
        

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