文字表示「Hello World!」

では実際にクライエントエリアになにかを表示してみましょう。
というわけで、プログラムでお決まりらしい文字列「Hello World!」を描いてみます。

文字を表示「DrawText」

今回も「多重起動の防止」のソースを
使いまわしますので、変更点だけを述べていきます。

     wndclass.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH) ;

今までウィンドウの背景をずっと白色のブラシにしていたので、
気分転換に薄い灰色にしてみましょう。

//==============================
//  ウィンドウプロシージャ
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
     {
     ……
     //DrawText用の領域を格納
     RECT rc;

構造体RECTの変数rcを宣言します。

typedef struct _RECT {
LONG left; LONG top; LONG right; LONG bottom;
} RECT;

RECTの中身は上のようになります。
左から順に、左上の点のx座標・y座標と右下の点のx座標・y座標です。
左上と右下の2点の座標内の四角形を表示領域として扱います。

          //再描画要求が行われた
          case WM_PAINT:
               //デバイスコンテキストを取得
               hdc = BeginPaint(hwnd, &paint);
               //クライアント領域を取得
               GetClientRect (hwnd, &rc);
               //文字列を描画
               DrawText(hdc,_T("Hello World!"),-1,&rc,DT_CENTER|DT_VCENTER);
               //デバイスコンテキストを解放
               EndPaint(hwnd, &paint);
               return 0 ;

GetClientRect関数でウィンドウのクライアント領域の値を
変数rcに格納し、DrawText関数でrc内に中央寄せで文字列を描画しています。

ではいよいよ文字列を表示してみます。

文字列を表示しました

・・・ん?文字のうしろの色が?これは次の話で解説します。

int DrawText( HDC , LPCWSTR , int , RECT * , UINT);
第一引数 HDC には、デバイスコンテキストのハンドルを指定します
第二引数 LPCWSTR には、文字列へのポインタを指定します
第三引数 int には、文字列の長さを指定します。-1なら自動的に指定されます
第四引数 RECT には、文字列を表示する領域を指定します
第五引数 UINT には、表示方法に関するマクロを指定します
UINTのパラメータ DT_LEFT:文字を左寄せにします
           DT_CENTER:文字を中央寄せにします
           DT_RIGHT:文字を右寄せにします
           DT_TOP:文字の高さにおいて、上寄せします
           DT_VCENTER:文字の高さにおいて、中央寄せします
           DT_BOTTOM:文字の高さにおいて、下寄せします

           DT_SINGLELINE:文字列を1行として扱います
           DT_WORDBREAK:文字列を折り返せるようにします
           DT_EXPANDTABS:文字列内のタブを有効にします
           DT_TABSTOP:一文字目に&の効果(アンダーライン)?
           DT_NOCLIP:クリッピングなしで描画する・これが指定されると若干早い
           DT_INTERNAL:テキストのメトリクスを計算するためにシステムフォントを使う
           DT_EXTERNALLEADING:?(効果不明)
           DT_NOPREFIX:?(効果不明)
           DT_CALCRECT:?(効果不明)

戻り値 成功すればテキストの高さが、失敗すれば0が返ります。

効果不明のところはお手数ですがMSDNでも参照してみて下さい。
日本語で書いてあるのに意味がわからない(汗)

ソースのダウンロード

自動改行とタブ

マクロによっては本当に色々な効果が出せるようですね。
とりあえずDT_WORDBREAK・DT_EXPANDTABSの状態を表示してみます。

以下に変更点を書きます。

     //DrawText用の領域を格納
     RECT rc1={60,60,179,179};
     RECT rc2={10,10,229,30};

RECTの中身を直接指定します。

               //デバイスコンテキストを取得
               hdc = BeginPaint(hwnd, &paint);
               //文字列を描画
               DrawText(hdc,_T("THE EMPEROR and Empress depart Saturday..."),-1,&rc1,DT_WORDBREAK);
               DrawText(hdc,_T("Tab	is	enabled."),-1,&rc2,DT_EXPANDTABS);
               //デバイスコンテキストを解放
               EndPaint(hwnd, &paint);

では実行してみます。

自動改行されています

DT_WORDBREAKの場合、領域内の限界まで行くと文字列を折り返します。
しかし、ギリギリに詰めて表示されるのではなく
半角スペースの入った区切りのいいところで改行され、
折り返し部分の半角スペースは消えているのに注目してください。
DT_EXPANDTABSでは、TABキーが有効になっています。

ソースのダウンロード

2005/5/22


戻る