1 第7回 文字列の表示 1 文字列の表示 (WM_PAINT メッセージ処理の

第7回 プログラミング基礎(2008/6/5)
第7回
1
文字列の表示
文字列の表示 (WM_PAINT メッセージ処理の場合)
[サンプル(WndProc 関数の一部)]
赤:関数 / 青:変数
HDC hDC;
PAINTSTRUCT ps;
・・・
case WM_PAINT:
hDC = BeginPaint( hWnd, &ps );
// 描画開始
TextOut( hDC, 100, 150, "Test Message", 12 );
// 文字表示
EndPaint( hWnd, &ps );
// 描画終了
break;
◇ BeginPaint 関数: 描画開始
デバイスコンテキスト・ハンドル(返り値)
= BeginPaint( ウィンドウ・ハンドル, PAINTSTRUCT 構造体へのポインタ );
◇ TextOut 関数: 文字列の描画
TextOut( デバイスコンテキスト・ハンドル, X座標, Y座標, 文字列, 文字数 );
◇ EndPaint 関数: 描画終了
EndPaint( ウィンドウ・ハンドル, PAINTSTRUCT 構造体へのポインタ );
◇ デバイスコンテキスト: ディスプレイやプリンタなどの出力デバイス(の情報)
デバイスコンテキスト・ハンドルは、その識別番号
◇ PAINTSTRUCT 構造体: 描画情報
HDC hdc
デバイスコンテキスト・ハンドル(BeginPaint の返値と同じ)
BOOL fErase
再描画領域がクリアされた(TRUE)/そのまま(FALSE)
RECT rcPaint
再描画領域
◇ RECT 構造体: 長方形領域の位置と大きさ
LONG
left
左上のX座標[pixel]
LONG
top
左上のY座標[pixel]
LONG
right
右下のX座標[pixel]
LONG
bottom
右下のY座標[pixel]
1
第7回 プログラミング基礎(2008/6/5)
2
文字列の表示 (WM_PAINT メッセージ処理以外の場合)
[サンプル(WndProc 関数の一部)]
HDC hDC;
・・・
case WM_LBUTTONUP:
hDC = GetDC( hWnd );
// DC取得
TextOut( hDC, 150, 100, "Left Button Up", 14 );
ReleaseDC( hWnd, hDC );
// DC解放
break;
◇ GetDC 関数: デバイスコンテキスト・ハンドルの取得
デバイスコンテキスト・ハンドル(返り値) = GetDC( ウィンドウ・ハンドル );
◇ ReleaseDC 関数: デバイスコンテキストの解放
ReleaseDC( ウィンドウ・ハンドル, デバイスコンテキスト・ハンドル );
3
文字列の作成
[サンプル]
int x = 12;
int y = 635;
char Strng[100] = "";
・・・
wsprintf( Strng, "%d x %d", x, y );
// 文字列作成
◇ 変数宣言と初期化:
変数の型 変数 = 初期値;
上記の例では、 変数 x を整数型で宣言するとともに、初期値として「12」を代入
変数 y を整数型で宣言するとともに、初期値として「635」を代入
変数 Strng を文字型で宣言するとともに、初期値として文字列「」(空)を代入
◇ wsprintf 関数: 文字列の作成
wsprintf( 文字変数(文字列の保存先), 書式[, 変数, ・・・] );
上記の例では、文字変数 Strng に文字列「12 x 635」が代入される。
2
第7回 プログラミング基礎(2008/6/5)
4
文字変数の文字列表示
[サンプル]
HDC hDC;
char Strng[100] = "";
・・・
TextOut( hDC, 100, 150, Strng, strlen(Strng) );
◇ strlen 関数: 文字列の文字数
文字数(返り値) = strlen( 文字変数 );
5
カーソルの座標
[サンプル(WndProc 関数の一部)]
HDC hDC;
POINTS mcur;
// POINTS 構造体
char Strng[100] = "";
・・・
case WM_LBUTTONUP:
mcur = MAKEPOINTS( lParam );
// カーソル座標
wsprintf( Strng, "%d x %d", mcur.x, mcur.y );
hDC = GetDC( hWnd );
TextOut( hDC, mcur.x, mcur.y, Strng, strlen(Strng) );
ReleaseDC( hWnd, hDC );
break;
◇ MAKEPOINTS マクロ: 座標値を POINTS 構造体に変換
POINTS 構造体(返り値) = MAKEPOINTS( 座標値 );
◇ POINTS 構造体: 2次元の座標
SHORT x
X座標
SHORT y
Y座標
上記の例では、マウスの左ボタンを離したとき、マウス・カーソルの位置に、その座標値(mcur.x,
mcur.y)が書式「(X座標) x (Y座標)」で表示される。
3
第7回 プログラミング基礎(2008/6/5)
6
強制的な再描画(WM_PAINT メッセージの送信)
[サンプル(WndProc 関数の一部)]
POINTS mcur;
・・・
HDC hDC;
char Strng[100] = "";
・・・
case WM_LBUTTONUP:
mcur = MAKEPOINTS( lParam );
InvalidateRect( hWnd, NULL, TRUE );
// 再描画命令
break;
case WM_PAINT:
wsprintf( Strng, "%d x %d", mcur.x, mcur.y );
hDC = BeginPaint( hWnd, &ps );
TextOut( hDC, mcur.x, mcur.y, Strng, strlen(Strng) );
EndPaint( hWnd, &ps );
break;
◇ InvalidateRect 関数: 再描画領域の生成
InvalidateRect( ウィンドウ・ハンドル, 再描画領域(RECT 構造体へのポインタ),
画面消去の有無(消去=TRUE/残す=FALSE) );
※ 第2引数「再描画領域」に「NULL」を指定すると、ウィンドウ全体が再描画の対象となる。
7
変数宣言の場所
◇ 関数内部で宣言された変数: ローカル変数
その関数内でのみ有効であり、その関数が実行されている間だけ、値を保持する。
◇ 関数の外で宣言された変数: グローバル変数
すべての関数で有効であり、いずれの関数が実行されている間でも、値を保持する。
4