デバイスコンテキストとは Win32API を通じてグラフィックを描画(表示)するために、ディスプレイ、ウィンドウ、メモリ、プリンタといったデバイスを抽象化したデータです。
デバイスコンテキストという形に抽象化されることによって、同じ関数で異なるデバイスにグラフィックを描画(表示)することができるようになります。たとえば、ディスプレイに四角形を描くための関数は Rectangle() ですが、プリンタに四角形を印字するための関数も Rectangle() です。
プログラムはデバイスコンテキストへ直接アクセスすることはできません。デバイスコンテキストを通じてグラフィックを描画(表示)するためには、デバイスコンテキストからデバイスコンテキストハンドルを取得し、そのハンドルを描画関数へ渡します。デバイスコンテキストからデバイスコンテキストハンドルを取得するためには GetDC() 関数を使います。
// ディスプレイのデバイスコンテキストハンドルを取得 HDC display = GetDC(NULL); // ディスプレイに四角形を描画 Rectangle(display, 100, 100, 200, 200); /* 中略 */ // デバイスコンテキストを解放 ReleaseDC(NULL, display);
ディスプレイやウィンドウなどのデバイスコンテキストは Windows によって自動的に生成されますが、ビットマップの読み込み先となるメモリなどのデバイスコンテキストは、あとから自分で用意する必要があります。
ゲームの場合は、画像ファイルの読み込み先としてデバイスコンテキストを生成するケースがほとんどです。この場合、デバイスコンテキストは CreateCompatibleDC() 関数によって生成します。 CreateCompatibleDC() 関数は、第1引数にデバイスコンテキストハンドルを受け取り、そのハンドルが示すデバイスコンテキストと互換性のあるデバイスコンテキストを生成します。互換性のあるデバイスコンテキスト同士は、グラフィックを相互に転送することができます。
// ディスプレイのデバイスコンテキストハンドルを取得 HDC display = GetDC(NULL); // ビットマップの読み込み先のデバイスコンテキストを生成 HDC memory = CreateCompatibleDC(display); /* 中略 */ // デバイスコンテキストを解放( CreateCompatibleDC() で作った場合は DeleteDC() ) DeleteDC(memory); // デバイスコンテキストを解放( GetDC() で取得した場合は ReleaseDC() ) ReleaseDC(display);
使い終わったデバイスコンテキストは解放する必要があります。 GetDC() によって取得したデバイスコンテキストは ReleaseDC() 関数、 CreateCompatibleDC() 関数で生成したデバイスコンテキストは DeleteDC() 関数によって解放します。
Contributions