VC++でシューティングゲームを作っているのですが・・・
下のコードをビルドすると、
自分の意図としては、ウィンドウの左上に自機ビットマップが表示されてほしいのですが、
真っ黒な画面になってしまいます。
正確に言うと、背景が黒、自機ビットマップの画像が真っ黒、自機ビットマップの領域にあたる四角が白くなります。
症状に見当がつかないので、手を貸して頂きたいです。
よろしくお願いします。
ちなみに、wc.hdrBackgroundは(HBRUSH)(COLOR_WINDOW+1)となっています。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
static RECT sizeWnd;
static HDC hDC; PAINTSTRUCT ps;
static HDC hMemDC; static HBITMAP hMemBmp;
static HDC hMjDC; static HBITMAP hMjBmp; static BITMAP infoMjBmp;
static POINT posMj;
static int flagMjShot; static POINT posMjShot;
switch (message)
{
case WM_CREATE:
GetClientRect(hWnd, &sizeWnd); // クライアント領域の大きさをsizeWndに格納
// フロントバッファの初期処理
hDC = GetDC(hWnd);
// バックバッファの初期処理
hMemDC = CreateCompatibleDC(hDC); // hDCと互換性をとるメモリデバイスコンテキストhMemDCを構築
hMemBmp = CreateCompatibleBitmap(hMemDC, sizeWnd.right, sizeWnd.bottom);
// hMemDCと互換性のあるビットマップhMemBmpをsizeWndの大きさで生成
SelectObject(hMemDC, hMemBmp);
// 自機ビットマップの初期処理
hMjDC = CreateCompatibleDC(hMemDC); // hMemDCと互換性をとるメモリデバイスコンテキストhMjDCを構築
hMjBmp = (HBITMAP)LoadImage( // ビットマップイメージMYJET(リソース)をhMjBmpに設定
(HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
MAKEINTRESOURCE(IDB_MYJET), IMAGE_BITMAP,
0, 0, LR_DEFAULTCOLOR
);
SelectObject(hMjDC, hMjBmp); // hMjDCにhMjBmpを設定
GetObject(hMjBmp, sizeof(BITMAP), &infoMjBmp); // hMjBmpのビットマップ情報をBITMAP構造体infoMjBmpに格納
SetTimer(hWnd, 1, 10, NULL); // 100分の1秒毎にWM_TIMERメッセージを送るタイマー1をセット
break;
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps); // hDCにディスプレイのデバイスコンテキストのハンドルを格納
BitBlt( // hDCにバックバッファhMemDCを転送
hDC, 0, 0, sizeWnd.right, sizeWnd.bottom,
hMemDC, 0, 0, SRCCOPY
);
EndPaint(hWnd, &ps);
break;
case WM_TIMER: // 一定時間毎の処理
// 自機ビットマップをバックバッファhMemDCに描画
StretchBlt( // hMjDCを、posMjを左上の座標として縦横を3倍に引き伸ばしてhMemDCに転送
hMemDC, posMj.x, posMj.y, infoMjBmp.bmWidth * 3, infoMjBmp.bmHeight * 3,
hMjDC, 0, 0, infoMjBmp.bmWidth, infoMjBmp.bmHeight, SRCCOPY
);
InvalidateRect(hWnd, NULL, FALSE);
break;
お礼
ご回答ありがとうございます、本当に助かりました。 しかし一つ不思議な事があります。 GDIではWM_CREATEメッセージの時点で描画したものが画像バッファに反映されているのですが、GDI+で同じようにWM_CREATEで、 Graphics Graph(hdc); //Graphics クラスのインスタンス を実行してWM_CREATE内でGDI+描画するとバッファに反映されていないんです。 しかしWM_PAINTで Graphics Graph(hdc); //Graphics クラスのインスタンス を実行し、WM_PAINT内でバッファにGDI+で描画すると描画されます。 上記が一つ目の疑問点です。 それからもう一つ不思議な事があります。 画像バッファにGDI+で描画した図形にアンチエリアスをかけていたのですが、ウインドウを別のウィンドウで隠したりして再描画させると最初にGDI+で描画した図形にアンチエリアスがかかっていません。 Graph.SetSmoothingMode( SmoothingModeAntiAlias ); 上記のようにアンチエリアス指定してから描画しています。 普通にGDI+だけで直接ウィンドウのHDCに対してWM_PAINTで描画している時にはアンチエリアスがかかっているのですが、不思議です。 たびたびすみませんがご教授よろしくお願いいたします。