ゲーム画面の描画に必要なデバイスコンテキストハンドルを取得する方法というのは、たいていの場合、次のどれかになると思います。迷ったら参考にしてください。たぶん、一度参考にしたら二度と必要なくなると思います。
WM_PAINT のタイミングで絶対に作られるデバイスコンテキストハンドルを利用してゲーム画面を描く方法です。当サイトで公開しているプログラムはこの方法を採用しています。赤坂玲音たん方式です(ちなみに氏は男性です)。
LRESULT CALLBACK WindowProcedure(HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { /* 省略 */ case WM_PAINT: HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hWindow, &ps); /* ここで hdc を対象にゲーム画面を描く。 */ EndPaint(hWindow, &ps); break; /* 省略 */ } return 0; }
こちらは Windows プログラミングに慣れている人でないとわかりづらいかもしれません。
自分の好きなタイミングでゲーム画面を描画したい場合は GetDC() 関数を使ってデバイスコンテキストハンドルを取得します。 GetDC() 関数にはウィンドウハンドルを渡す必要があります。では、ウィンドウハンドルはどのように取得するかというと CreateWindow() 関数の戻り値として受け取ることができます。 CreateWindow() 関数はウィンドウを作る関数です。たいていの場合、ゲーム画面はウィンドウに描画しますよね?そのウィンドウを作るときの戻り値を記憶しておけばいいわけです。
// ゲーム画面の土台となるウィンドウを作る HWND hWindow = CreateWindow(/* 省略 */); // ゲーム画面を描画したいとき HDC hdc = GetDC(hWindow); /* ここで hdc を対象にゲーム画面を描く。 */ ReleaseDC(hWindw, hdc); // 後始末
こちらは Windows のしがらみが嫌いな人にお勧めです。私も昔はこっち派の人間でした。こちらのサンプルも用意できると理想的ですよね。
ちなみに、メルマガで「小さいプログラム」をテーマにしているときはこちらの方法を使っています。「小さいプログラム」をテーマにしている場合は、描画先がデスクトップですので GetDC() 関数には NULL を渡します。
HDC hdc = GetDC(NULL); /* ここで hdc を対象にゲーム画面を描く。 */ ReleaseDC(NULL, hdc);
Contributions