(←クリックするとアマゾンに行きます)

第2日目は、クライアント領域に文字を表示する方法がわかればOKです。


その前に、何もしないウィンドウをすぐに作ることができるか確認してください。 細かいところはわからなくて大丈夫です。ひな形のソースプログラムをコピーして、 それでウィンドウが作ることができれば問題ありません。

文字を表示する、一番確実な方法は、WM_PAINTメッセージが来たときに描画を行うことです。 文字に限らず、グラフィックスを表示するときもWM_PAINTメッセージが来たときにおこなうのが 間違いありません。

具体的には、ウィンドウプロシージャに次のようにプログラムを書き足します。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	PAINTSTRUCT ps;
	HDC hdc;
	......(略)

	switch (msg) {
		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			TextOut(hdc, 10, 10, (LPCTSTR)szStr, (int)strlen(szStr));
			EndPaint(hWnd, &ps);
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return (DefWindowProc(hWnd, msg, wp, lp));
	}
	return 0;
}
文字を描画するには、TextOut関数を使うのが最も簡単です。

最初の引数(hdc)は、デバイスコンテキスト・ハンドルと呼ばれるものです。 これは、このハンドルを取得すればほとんどのデバイスに、TextOut関数などで 描画できます。たとえば、プリンタのデバイスコンテキスト・ハンドルを取得できれば プリンタで印刷刷できるわけです。

さて、BeginPaint関数は、指定されたウィンドウに対して、描画の準備をします。 戻り値はウィンドウ描画に使用するデバイスコンテキスト・ハンドルです。

BeginPaint関数とEndPaint関数は必ず、対にして使います。

WM_PAINTメッセージが来たとき以外には、BeginPaint関数は使えません。

WM_PAINTメッセージは、再描画が必要なときシステムから飛んできます。

自分でWM_PAINTメッセージを飛ばすことはできません。

自分でWM_PAINTメッセージに書いてあるプログラムを実行したいときが来たら どうすればよいのでしょうか。それには、InvalidateRect関数を使います。

これで、無理矢理無効領域を発生させてやると、システムからWM_PAINTメッセージが やってきます。これは、頻繁に使うテクニックなので是非覚えておきましょう。

その他、DrawText関数など、TextOut関数よりもう少し細かく書式を制御できる 関数がありますので、目を通しておいてください。(P51-)

さて、文字が表示できるようになったら、グラフィックスも同じように描画できます。 Rectangle関数は四角形を描画します。(p86)

BOOL Rectangle(
  HDC hdc,         
  int nLeftRect,   
  int nTopRect,    
  int nRightRect,  
  int nBottomRect  
);
最初の引数はデバイスコンテキスト・ハンドルです。あとの4つの引数は、 左上隅のx,y座標、右下隅のx,y座標です。

デバイスコンテキスト・ハンドルさえ取得できれば簡単に使えますね。

これでまだ、2日目ですがテキストやグラフィックスが表示できるようになりました。


08/Aug/2005 By Y.Kumei
[総合INDEX] [目次] [第1日] [第3日]