文字フォントを設定して描画する

VC++ でフォントの書体やサイズや傾きを設定して文字を描画します。

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

プロジェクトの設定

  1. 新規プロジェクトを作成して「関数の宣言」までスクロールして下さい。
    文字フォントを設定する関数を定義します。
        // このコード モジュールに含まれる関数の宣言を転送します :
        ATOM                MyRegisterClass(HINSTANCE hInstance);
        BOOL                InitInstance(HINSTANCE, int);
        LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
        LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
        HFONT               SetMyFont(HDC, LPCTSTR, int, int); 
    
        //★ Font を設定する
        HFONT SetMyFont(LPCTSTR face,int h,int angle)
        {   HFONT   hFont;
            hFont=  CreateFont(h,       //フォント高さ
                0,                      //文字幅(高さと同じ)
                angle,                  //テキストの角度
                0,                      //ベースラインとx軸との角度
                FW_REGULAR,             //フォントの重さ(太さ)
                FALSE,                  //イタリック体
                FALSE,                  //アンダーライン
                FALSE,                  //打ち消し線
                SHIFTJIS_CHARSET,       //文字セット
                OUT_DEFAULT_PRECIS,     //出力精度
                CLIP_DEFAULT_PRECIS,    //クリッピング精度
                PROOF_QUALITY,          //出力品質
                FIXED_PITCH|FF_MODERN,  //ピッチとファミリー
                face);                  //書体名
            return hFont;
        }
        
  2. WM_PAINT に色々なフォントを設定して文字を表示するコードを追加します。
    フォントの設定は、ペンやブラシと同じようにプログラムします。
    SetMyFont() で新しいフォントを生成します。
    SelectObject() で新しいフォントを選択して、元のフォントを hFontOld に保存します。
    新しいフォントを使って描画します。
    描画が終わったら元のフォントに戻して、新しいフォントを削除します。
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // TODO: 描画コードをここに追加してください...
            HFONT       hFont,hFontOld;
    
            SetBkMode(hdc,TRANSPARENT);
            hFont= SetMyFont((LPCTSTR)"MS ゴシック", 40, 450);
            hFontOld= (HFONT)SelectObject(hdc, hFont);
            TextOut(hdc,10,300,(LPCTSTR)"MS ゴシック 40", 16);
            SelectObject(hdc,hFontOld);
            DeleteObject(hFont);
    
            hFont= SetMyFont((LPCTSTR)"MS 明朝", 24, -450);
            hFontOld = (HFONT)SelectObject(hdc, hFont);
            SetTextColor(hdc,RGB(255,0,0));
            TextOut(hdc, 10, 10, (LPCTSTR)"MS 明朝 24", 12);
            SelectObject(hdc, hFontOld);
            DeleteObject(hFont);
    
            hFont = SetMyFont((LPCTSTR)"MS 明朝", 96, 0);
            hFontOld = (HFONT)SelectObject(hdc, hFont);
            SetTextColor(hdc, RGB(0, 255, 0));
            TextOut(hdc, 10, 150, (LPCTSTR)"MS 明朝 96", 12);
            SelectObject(hdc, hFontOld);
            DeleteObject(hFont);
    
            EndPaint(hWnd, &ps);
            break;
        
  3. SetMyFont() の "MS ゴシック" はフォントの指定で、TextOut() の"MS ゴシック 40" は画面に表示する文字列です。
    フォントはシステムに登録されているものに限ります。
    設定できるフォントの種類はメモ帳などを起動して「書式/フォント(F)」で確認して下さい。
    フォント名は、全角/半角,大文字/小文字や空白も一致させなければなりません。

  4. [デバッグ][デバッグなしで開始]を選択して、ビルドに続いて実行を行います。

固定ピッチフォント

  1. ビジネスアプリケーションでは、カラムを揃えて表示することが多々あります。
    特に表形式にするときは、カラムが揃っている方が見栄えが良くて喜ばれるでしょう。
    今度は手軽に使えるストックオブジェクトを使って、文字のピッチを揃えて表示します。
  2. WM_PAINT: でフォントを設定して DrawText() で描画します。
    buf は TEXT 文字列が格納されている char[] の領域です。
    SYSTEM_FIXED_FONT がシステムに用意されているストックオブジェクトのフォントです。
    自分でフォントを生成したときのように、開放する必要はありません。
        HDC         hdc;
        PAINTSTRUCT paint;
        RECT        rt;
        HFONT       hFontOld;
    
            case WM_PAINT:
                hdc= BeginPaint(hWnd,&paint);
                GetClientRect(hWnd, &rt);
                hFontOld= (HFONT)SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
                DrawText(hdc,buf,-1,&rt,DT_WORDBREAK);
                SelectObject(hdc,hFontOld);
                EndPaint(hWnd, &paint);
                break;
        

【演習】

  1. 様々なフォントを組み合わせて描画してみて下さい。
  2. CreateFont() 関数のパラメータを変えて、文字がどのように変わるか試して下さい。
  3. 次の行をコメントにして、その効果を確認して下さい。
    //SetBkMode(hdc,TRANSPARENT);

色やサイズを気にしなければ TextOut() だけで文字を表示することが出来ます。
    case WM_PAINT:
        hdc= BeginPaint(hWnd,&paint);
        TextOut(hdc,10,300,(LPCTSTR)"文字を表示します。", 18);
        EndPaint(hWnd, &paint);
        break;

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