W32 OpenFile

BMP 画像を選択して描画します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. C++ Windows デスクトップ(Win32 API に準じる)で GetOpenFileName() で BMP 画像を選択して描画します。
    Visual Studio で [C++ Windows デスクトップ] のプロジェクトを作成します。
    プロジェクトの作成は W32 Hello を参照して下さい。
  2. WindowsProject1.cpp で commdlg.h を #include して、ファイル名の領域を定義します。
    続いて後位参照が起こらないように OpenFile() 関数と ShowBMP() 関数を定義します。
    #include <commdlg.h>
    WCHAR   szFile[MAX_PATH];       //ファイル名(パス付き)
    
    //★ OPENFILENAME 構造体で BMP ファイルを選択する
    LRESULT OpenFile()
    {   OPENFILENAME    ofn;
    
        memset(&ofn,0,sizeof(OPENFILENAME));
        ofn.lStructSize= sizeof(OPENFILENAME);
        ofn.hwndOwner= NULL;
        ofn.lpstrFilter= L"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= L"bmp";
        ofn.lpstrTitle= L"ファイルオープン!";
        if (GetOpenFileName(&ofn)!=TRUE)
        {   MessageBox(NULL,L"Open キャンセル",L"Bmp Open",MB_OK);
            return FALSE;
        }
        return TRUE;
    }
    
    //★ BMP 画像を表示する
    HRESULT ShowBMP(HWND hWnd, LPCWSTR szBitmap)
    {   HBITMAP         hbm;
        HDC             hdc,hmdc;
        BITMAP          bm;
    
        //ファイルからイメージをロード
        hbm = (HBITMAP)LoadImage(NULL,szBitmap,IMAGE_BITMAP,0,0,
                       LR_LOADFROMFILE|LR_CREATEDIBSECTION);
        if (hbm==NULL)
        {   OutputDebugString(L"Load Image Error\n");
            return S_FALSE;
        }
        hdc= GetDC(hWnd);
        hmdc= CreateCompatibleDC(hdc);
        SelectObject(hmdc,hbm);
        GetObject(hbm,sizeof(bm),&bm);
        BitBlt(hdc,0,0, bm.bmWidth, bm.bmHeight,hmdc,0,0,SRCCOPY);
        DeleteDC(hmdc);
        ReleaseDC(hWnd, hdc);
        DeleteObject(hbm);
        return S_OK;
    }
    
  3. WindowsProject1.cpp の WM_CREATE: で BMP 画像を選択して、ファイルの名前を szFile[] に格納します。
    WM_PAINT: から ShowBMP() 関数で szFile[] の画像をロードして描画します。
        switch(msg)
        {   case WM_CREATE:
                OpenFile();
                break;
            case WM_PAINT:
                hdc= BeginPaint(hWnd, &ps);
                ShowBMP(hWnd,szFile);
                EndPaint(hWnd, &ps);
                break;
    
  4. OpenFile() 関数は Local Folder からファイルを選択する関数です。
    lpstrFilter で選択するファイルのタイプを設定します。
    lpstrFile= szFile; は選択されたファイルの名前を格納する領域です。
    GetOpenFileName() でダイアログボックスが表示されるので、BMP ファイルを選択します。
        ofn.lpstrFilter= L"bmp(*.bmp)\0*.bmp\0All files(*.*)\0*.*\0\0";
        ofn.lpstrFile= szFile;
        if (GetOpenFileName(&ofn)!=TRUE)
    
  5. ShowBMP() 関数は画像ファイルをロードして描画する関数です。
    LoadImage() で画像をロードして BitBlt() で描画します。
        hbm = (HBITMAP)LoadImage(NULL,szBitmap,IMAGE_BITMAP,0,0,
                       LR_LOADFROMFILE|LR_CREATEDIBSECTION);
        BitBlt(hdc,0,0, bm.bmWidth, bm.bmHeight,hmdc,0,0,SRCCOPY);
    
  6. x64 または x86 を選んで、右三角矢印(または F5 キー)でコンパイルします。
    プログラムを起動すると画像を選択するダイアログボックスが開きます。
    BMP 画像を選択するとウインドウに画像が描画されます。
    メニューから[ファイル][終了する]を選ぶとプログラムが終了します。
    Windows デスクトップ アプリケーションは UWP のように自動的にメニューに登録されることは無いようです。
    プログラムは Win32 API に準じるようです。詳細は[超初心者のプログラム入門(C言語 Windows)]を参照して下さい。

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

超初心者のプログラム入門(C言語 Windows)