入力ファイルを選択する

★CommonDialog は Windows Program で使用する汎用的な DialogBox のAPIです。
VC++ の GetOpenFileName() でファイルを選択して TEXT DATA を入力します。

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

プロジェクトの設定

  1. テンプレートまたは、空のプロジェクトから作成して下さい。
  2. szFile[] は GetOpenFileName() で選択されたファイル名を格納する領域です。
    szDir[] はファイルを検索するフォルダーです。
    buf[] はファイルから TEXT Data を入力する領域です。
    最初に格納されている "ERROR\r\n" はファイル入力に失敗したときのメッセージです。
        char        szFile[MAX_PATH];           //ファイル名(パス付き)
        char        szDir[MAX_PATH]= "C:\\";    //検索フォルダー
        char        buf[30001]= "ERROR\r\n";    //入力領域
        
  3. GetOpenFileName() を使って、拡張子が「*.txt」のファイルを選択する関数です。
    選択されたファイルのフルパスが szFile[] に格納されます。
        //★ OPENFILENAME 構造体で入力ファイルを設定する
        LRESULT GetOpenFile()
        {   OPENFILENAME    ofn;
    
            szFile[0]= 0;
            memset(&ofn,0,sizeof(OPENFILENAME));
            ofn.lStructSize= sizeof(OPENFILENAME);
            ofn.hwndOwner= NULL;
            ofn.lpstrFilter= "txt(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0";
            ofn.lpstrFile= szFile;
            ofn.lpstrFileTitle= NULL;
            ofn.nMaxFile= MAX_PATH;
            ofn.Flags= OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
            ofn.lpstrDefExt= "txt";
            ofn.lpstrTitle= "ファイルオープン!";
            ofn.lpstrInitialDir= szDir;
    
            if (GetOpenFileName(&ofn)!=TRUE)
            {   MessageBox(NULL,"Open File Name Error","GetOpenFile",MB_OK);
                return FALSE;
            }
            return TRUE;
        }
        
  4. szFile[] から buf[] にデータを入力する関数です。
    入力データの最後に文字列の終わりを示す NULL('\0') を付加しておいて下さい。
    ファイル入力の詳細は TEXT ファイルを入力して画面に表示する を参照して下さい。
        //★ szFile から最大 30000 バイトのデータを buf に読み込む
        DWORD   ReadData()
        {   HANDLE      hFile;
                :
        }
        
  5. WM_CREATE でファイルを入力して WM_PAINT で表示します。
        switch(msg)
        {   case WM_CREATE:
                strcpy(buf,"ERROR");
                if (GetOpenFile()==TRUE)    ReadData();
                break;
            case WM_PAINT:
                hdc= BeginPaint (hWnd, &ps);
                GetClientRect(hWnd,&rt);
                DrawText(hdc,buf,-1,&rt,DT_WORDBREAK);
                EndPaint(hWnd, &ps);
                break;
        
  6. このままではウインドウサイズを変更したとき画面が乱れることがあります。
    WM_SIZE でサイズの変更を受け取って再描画すると画面の乱れが無くなります。
            case WM_SIZE:
                InvalidateRect(hWnd,NULL,TRUE);
                break;
        
  7. C# でも同様のプログラムを作成しています。
    超初心者のプログラム入門(C#)から Open File Dialog を参照して下さい。
    リンクがエラーになるときは「前田稔の超初心者のプログラム入門」から辿って下さい。

【演習】

  1. プログラムを完成させて下さい。
  2. 次の行をコメントにすると、プログラムを実行したとき何かが変わります。
    「何がどう違う」のか調べて下さい。
    ofn.lpstrInitialDir= szDir;
  3. フルパスのファイル名からパスを除いたファイル名を抜き出す関数も用意されています。
        char    szTitle[128]= "Title";
    
            GetFileTitle(フルパスのファイル名, szTitle, sizeof(szTitle));
        

【メモ】

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

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