GDI でウィンドウに円や多角形、文字列、ビットマップを描画するにはウィンドウハンドルからデバイスコンテキストハンドルを取得する必要があります。
ここで、ウィンドウと呼ぶのは「ゲーム用のウィンドウを作成する」で解説した Windows フォームだけではない点に注意してください。 Windows 開発においてはボタンやリストボックスなど入力機能を持つオブジェクト全般をウィンドウと呼称します。 Windows という名前の由来はこのようにすべてのオブジェクトがウィンドウと呼称される様からきているそうです。
さて GDI を使用するためにはまず描画対象のウィンドウハンドルを得る必要があります。ウィンドウハンドルとはウィンドウを識別するためのオブジェクトです。プログラム中では HWND 型の変数として表現します。
最も多いのは「ゲーム用のウィンドウを作成する」で解説した Windows フォームに描画するパターンです。 Windows フォームのウィンドウハンドルは CreateWindow() 関数の戻り値で取得します。 Windows フォームのウィンドウハンドルは随所で参照するためグローバル変数に格納しておくのもひとつの手段です。
// Windows フォームのウィンドウハンドルを取得する HWND hWindow; hWindow = CreateWindow(/* 引数は省略します */);
次にウィンドウハンドルに対するデバイスコンテキストハンドルを取得します。デバイスコンテキストハンドルとはウィンドウに対して GDI 描画するための窓口となるオブジェクトです。プログラム中では HDC 型の変数として表現します。
デバイスコンテキストは描画対象がディスプレイの場合やプリンタの場合でも同じ GDI 関数が使えるように出力対象を抽象化する中継ぎの役割を果たします。
デバイスコンテキストハンドルはウィンドウハンドルを元に GetDC() 関数で取得します。
// Windows フォームのウィンドウハンドルを取得する HWND hWindow; hWindow = CreateWindow(/* 引数は省略します */); // ウィンドウハンドルからデバイスコンテキストハンドルを取得する HDC hDC; hDC = GetDC(hWindow);
デバイスコンテキストハンドルが取得できれば GDI による描画の準備は終了です。
// GDI による描画の例 Rectangle(hDC, 100, 100, 200, 200); Ellipse(hDC, 100, 100, 200, 200);
GDI による描画を終えた際にはデバイスコンテキストハンドルを解放します。
// デバイスコンテキストハンドルの解放 ReleaseDC(hWindow, hDC);
Contributions