TEXT ファイルを入力して画面に表示する



VC++ の ReadFile() で TEXT 形式のファイルを入力して DrawText で画面に表示します。

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

プロジェクトの作成

  1. プロジェクト(FileIN)を作成して下さい。
    プロジェクトの作成は Windows プログラムを自動的に作成する を参照して下さい。
  2. ソースファイル(FileIN.cpp)を編集します。
    TEXT データを入力する領域を定義して下さい。
    char buf[3004];
  3. WM_CREATE: を追加します。
        LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
        {
            int wmId, wmEvent;
            PAINTSTRUCT ps;
            HDC hdc;
            HANDLE  hFile;              //File Handle
            DWORD   dwBytes;            //入力長
    
            switch( message ) 
            {   case WM_CREATE:
                    hFile = CreateFile("resource.h",GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
                    if (hFile==INVALID_HANDLE_VALUE)
                    {   MessageBox(NULL,"resource.h Open Error","FILE INPUT", MB_OK);
                        return 0;
                    }
                    ReadFile(hFile,buf,3000,&dwBytes,NULL);
                    buf[dwBytes]= '\0';
                    CloseHandle(hFile);
                    break;
        
  4. WM_PAINT: で TEXT を表示します。
        case WM_PAINT:
            hdc = BeginPaint (hWnd, &ps);
            // TODO: この位置に描画用のコードを追加してください...
            RECT rt;
            GetClientRect( hWnd, &rt );
            DrawText( hdc, buf, strlen(buf), &rt, DT_WORDBREAK);
            EndPaint( hWnd, &ps );
            break;
        
  5. ビルド(コンパイル)に続いて実行を行います。
    [デバッグ][デバッグなしで開始]を選択して、ビルドに続いて実行を行います。
    コンパイルの進行状況とエラーがあれば、エラーメッセージが表示されます。
  6. プログラムの確認が終われば[ファイル(F)][アプリケーションの終了(X)]で終了させて下さい。

プログラムの説明

ファイルの入出力には MS-DOS の仕様も含めて様々な関数が提供されていますが、ここでは Windows の 標準と思われる入出力について説明します。
  1. TEXT データを入力する領域です。
    最大 3000 バイトまで入力します。
    4 バイトの端数はファイルや文字列の終了コード('\0')を格納するために設けています。
        char  buf[3004];
        
  2. ファイルを入力する処理です。
    CreateFile() で File Handle を取得します。
    GENERIC_READ はファイルのアクセスタイプの指定で、データを読み取ります。
    OPEN_EXISTING はファイルが既に存在するときのアクションで、存在しないとエラーになります。
    File Handle が INVALID_HANDLE_VALUE の時はオープンの失敗です。
    ReadFile() でファイルから最大 3000 Byte のデータを buf[] に入力します。
    dwBytes には実際に入力されたバイト数が格納されます。
    buf[dwBytes]= '\0'; で文字列の最後に終了コードを付加します。
    TEXT 形式のファイルなら何でも良いのですが、このプログラムでは "resource.h" を入力しています。
        HANDLE  hFile;              //File Handle
        DWORD   dwBytes;            //入力長
                  :
            case WM_CREATE:
                hFile = CreateFile("resource.h",GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
                if (hFile==INVALID_HANDLE_VALUE)
                {   MessageBox(NULL,"resource.h Open Error","FILE INPUT", MB_OK);
                    return 0;
                }
                ReadFile(hFile,buf,3000,&dwBytes,NULL);
                buf[dwBytes]= '\0';
                CloseHandle(hFile);
        
  3. GetClientRect() でウインドウサイズを取得して DrawText() で表示します。
        case WM_PAINT:
            hdc = BeginPaint (hWnd, &ps);
            // TODO: この位置に描画用のコードを追加してください...
            RECT rt;
            GetClientRect( hWnd, &rt );
            DrawText( hdc, buf, strlen(buf), &rt, DT_WORDBREAK);
            EndPaint( hWnd, &ps );
            break;
        
  4. CreateFile() で指定するアクセスタイプの説明です。
    値の説明
    0 デバイス属性の問い合わせ
    GENERIC_READ 読み取りアクセス
    GENERIC_WRITE 書き込みアクセス
  5. ファイルが既に存在するときのアクションの説明です。
    値の説明
    CREATE_NEW 新しく作成します。既にファイルが存在すると失敗
    CREATE_ALWAYS 新しく作成します。既にファイルが存在すると上書き
    OPEN_EXISTING ファイルが存在しないと失敗
    TRUNCATE_EXISTING サイズをゼロにする。ファイルが存在しないと失敗
  6. Windows 10 で Empty TextIO 空のプロジェクトからファイルを入出力します。

【課題1】

このプログラム自身(*.cpp) を入力して表示して下さい。

【課題2】

このプログラムでは、直接ウインドウに DrawText() で表示しましたが DialogBox を使う方法もあります。
DialogBox を使ってソースプログラム自身を表示するプログラムを作成して下さい。
DialogBox の基本は Dialog Box のプログラム を参照して下さい。
  1. Dialog Box 全体に[EditControl]を貼り付けて、プロパティに以下の制御を設定して下さい。
  2. ソースプログラムを表示する前に、次の TEXT を表示して下さい。
    Dialog Box では WM_CREATE: はポストされません。
    WM_CREATE: の代わりに WM_INITDIALOG: を使います。
        char    text[] = "abc\r\nABC\r\nxyz\r\nXYZ\r\nNHK\r\n";
    
        SetDlgItemText(hDlg,IDC_EDIT1,text);
        
  3. うまく表示ができたでしょうか?
    EditControl のテキストを直接編集して、改行されることを確かめて下さい。
    またラインが溢れると自動的にスクロールバーが表示されることを確認して下さい。
  4. うまく表示できるようになったら、このプログラム自身(*.cpp) を入力して表示して下さい。

【NOTE】

画面に「フフフ...」が表示されることがあります。
原因はファイルから TEXT データが正常に入力出来なかったためです。
関数の中(スタック領域)で領域を確保すると、デバッグモードではコンパイラが意識的にスタック領域を「フフフ」で初期化しています。
リリースモードではスタック領域の初期値は不定なので、同じプログラムでも実行する度に違う結果が表示されたりするので特に注意が必要です。
グローバル領域に確保した領域はゼロでクリアされるので、このようなことは起こりません。

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