ゲーム好きがプログラマを目指すブログ

いつかゲーム作れるようになれたらいいなぁ。。。と思う日々

Win32APIのお勉強をしました(ウィンドウ生成~文字の描画)。後編

 後編ということで、文字列の描画編
 最終目標のタイピングゲーム作成までの道のりは長い。。。
 Win32の専門書とか買ったほうがいいのかも

【使う関数】
 文字列を表示するには、TextOut関数を使えばおk。デバイスコンテキストへのハンドラ(HDC)とかいう謎の構造体がでてきたが、これに対して描画指示を送ると画面に文字が表示される。(多分デバイスはディスプレイとかを指す?)

BOOL TextOut{
	HDC hdc,		//デバイスコンテキスト
	int x,			//位置(文字列の左上)
	int y,			//位置(文字列の左上)
	LPCSTR lpString,	//表示する文字列
	int c			//lpStringの文字数、lstrren(lpString)で文字数を取得できる
};

ここで使うHDCの取得には、BeginPaint()かGetDC()を使えばよさげらしいけど、今回はGetDC()を使ってみる。GetDCで取得したHDCは、使い終わったらReleaseDC()で解放する。
ということで、文字を描画する部分(ウィンドウプロシージャ内に書く)はこんな感じになる。

HDC hdc;
hdc = GetDC(hWnd);	//hWndは前回のWinProcの第一引き数
TCHAR output = _T("Hello, Win32API");
TextOut(hdc, 0, 0, output, lstrren(output));
ReleaseDC(hWnd, hdc);


【実際に表示してみる】
さっきのコードを、WinProcのWM_PAINTイベントが発生した場合の部分に追記してみる。

LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	TCHAR output[] = _T("Hello, Win32API");
	
	switch(uMsg){
	case WM_PAINT:
		hdc = GetDC(hWnd);
		TextOut(hdc, 0, 0, output, lstrlen(output));
		ReleaseDC(hWnd, hdc);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
};

こんな感じで表示された。

f:id:elizack_666:20210402123938p:plain
実行した画像

【小言】
これ前後編に分ける必要なかったな。。。と書き終わってから思った
次回はキー入力イベントを勉強しようかな