アプリ版:「スタンプのみでお礼する」機能のリリースについて

下のコードをビルドすると、
自分の意図としては、ウィンドウの左上に自機ビットマップが表示されてほしいのですが、
真っ黒な画面になってしまいます。
正確に言うと、背景が黒、自機ビットマップの画像が真っ黒、自機ビットマップの領域にあたる四角が白くなります。
症状に見当がつかないので、手を貸して頂きたいです。
よろしくお願いします。
ちなみに、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;

A 回答 (2件)

とりあえず…


作成されたばかりのデバイスコンテキストには、1x1ピクセルのモノクロビットマップが選択されています。
なので『hMemDCと互換性のあるビットマップhMemBmp』はモノクロになってしまうのです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
確かに、ここがおかしいですね。
hMemBmp = CreateCompatibleBitmap(hMemDC, sizeWnd.right, sizeWnd.bottom);
正直言うと”互換性”の言葉の意味をよくわかってなかったので、
わからなかった理由としては、それが大きかったです。
自分の意図としては、上のhMemDCをhDCに換えたものが正しいのかなと思います。
あとクライアント領域の全体を白くするには、”領域と同じ大きさの白い長方形を描画する”で正しいのでしょうか?
何度も申し訳ないですが、お願いします。

お礼日時:2007/06/17 03:49

> あとクライアント領域の全体を白くするには、”領域と同じ大きさの白い長方形を描画する”で正しいのでしょうか?



ウィンドウのクライアント領域を塗るという意味であれば正しくありません。
hMemBmpで示されるビットマップでクライアント領域全体が埋まるので、クライアント領域を消去しても意味がありません。
塗り潰すべき背景はhMemBmpで示されるビットマップにあります。
”領域と同じ大きさの白い長方形を描画する”のはhMemBmpで示されるビットマップに対して、になります。
#wc.hdrBackgroundはNULLにしておくと無駄な処理が減ります。
#むしろNULLでないとウィンドウ操作時に激しく点滅することがあります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
自分の言葉足らずな部分があったようで恐縮します。
>#wc.hdrBackgroundはNULLにしておくと無駄な処理が減ります。
思いも寄らない情報で、助かりました。
早速変えておこうと思います。

お礼日時:2007/06/17 14:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!