画像ファイルの内容をウィンドウに描画するためには、次のステップを踏みます。
まずは図解をご覧ください。
以下、ソースコードとともにひとつずつ詳細を解説します。
まず、描画先のデバイスコンテキストハンドルを用意します。 WM_PAINT 内であれば BeginPaint() 関数の戻り値として取得できます。 WM_PAINT 以外の場所の場合は GetDC() 関数を使います。詳しくは「ゲーム画面の描画に必要なデバイスコンテキストハンドルを取得する」を参照ください。
// WM_PAINT 内 HDC destHDC = BeginPaint(hWnd, &ps); // WM_PAINT 外 HDC destHDC = GetDC(hWnd);
描画先のデバイスコンテキストハンドルを取得することができたら、そのハンドルが示すデバイスコンテキストと互換性のあるデバイスコンテキストを作成します。このデバイスコンテキストは画像ファイルの読み込み先になります。あるデバイスコンテキストと互換性のあるデバイスコンテキストを作成するためには CreateCompatibleDC() 関数を使います。
// destHDC と互換性のあるデバイスコンテキストを作成し、ハンドルを返す HDC srcHDC = CreateCompatibleDC(destHDC);
描画先と、画像ファイルの読み込み先のデバイスコンテキストができたら、画像ファイルを読み込みます。画像ファイルを読み込むためには LoadImage() 関数を使います。画像ファイルの置き場所については「画像ファイルを LoadImage() 関数で読み込めるようにする」を参照してください。
// 画像ファイルを読み込む HBITMAP bitmap = (HBITMAP)LoadImage(NULL, TEXT("madoka.bmp"), // 読み込むファイル名 IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
画像が読み込めたら、先ほど CreateCompatibleDC() 関数で作ったデバイスコンテキストへ、画像ファイルの内容を適用します。画像ファイルの内容をデバイスコンテキストへ適用するためには SelectObject() 関数を使います。
// srcHDC に bitmap を適用する SelectObject(srcHDC, bitmap);
デバイスコンテキストに画像ファイルの内容が適用できたら完了です。あとは、画像の読み込み先( srcHDC )から描画先( destHDC )へデータを転送することにより、自分の好きなようにグラフィックを表示することができるようになります。グラフィックデータを転送するためには BitBlt() 関数を使います。詳しくは「ビットマップをブロック転送する」を参照してください。
// 画像を転送する BitBlt(destHDC, // 描画先( HDC ) 320, 240, // 描画先の左上座標 32, 32, // 転送する幅 srcHDC, // 転送元( HDC ) 120, 100, // 転送元の左上座標 SRCCOPY); // 転送方式
最後に、使ったリソースを解放してシステムへ返します。 GetDC() 関数で取得したデバイスコンテキストハンドルは ReleaseDC() 関数で解放し、 CreateCompatibleDC() 関数で作成したデバイスコンテキストハンドルは DeleteDC() 関数で解放します。詳しくは「 ReleaseDC() と DeleteDC() の違い」を参照ください。
// 使い終わったリソースを解放する DeleteObject(bitmap); DeleteDC(srcHDC); ReleaseDC(hWnd, destHDC);
// WM_PAINT 内 HDC destHDC = BeginPaint(hWnd, &ps); // WM_PAINT 外 HDC destHDC = GetDC(hWnd); // destHDC と互換性のあるデバイスコンテキストを作成し、ハンドルを返す HDC srcHDC = CreateCompatibleDC(destHDC); // 画像ファイルを読み込む HBITMAP bitmap = (HBITMAP)LoadImage(NULL, TEXT("madoka.bmp"), // 読み込むファイル名 IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // srcHDC に bitmap を適用する SelectObject(srcHDC, bitmap); // 画像を転送する BitBlt(destHDC, // 描画先( HDC ) 320, 240, // 描画先の左上座標 32, 32, // 転送する幅 srcHDC, // 転送元( HDC ) 120, 100, // 転送元の左上座標 SRCCOPY); // 転送方式 // 使い終わったリソースを解放する DeleteObject(bitmap); DeleteDC(srcHDC); ReleaseDC(hWnd, destHDC);
Contributions