DIBとDDB – プログラミング – Home

通知
すべてクリア

[解決済] DIBとDDB


Beginner
 Beginner
(@Beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

いつもお世話になります。
Off screenの仕方とか色々教えて頂きました。
その結果完成したブロック崩しですが、他のコンピューター(XGAのWin ME)で動かしたところ、
画面が丁度カラーテレビが壊れかけで色々な色がちらつくような画面となりました。
自分でプログラムを作成した、SXGAのWin2Kではちゃんと背景が黒くなります。

これは、MFCで扱うビットマップがDDBしかサポートしていないからなのでしょうか。
そのように
http://www.jouban.prug.or.jp/u/kit/Soft/jgb_view.htmlには書いてあります。

ちなみにビットマップを扱う部分のプログラムは以下の通りです。

void CBlockHitGameView::OnDraw(CDC* pDC)
{
CBlockHitGameDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
CDC memDC, offDC;
memDC.CreateCompatibleDC(pDC);
offDC.CreateCompatibleDC(pDC);
CBitmap bmpOff;
bmpOff.CreateCompatibleBitmap(pDC, WIDTH, HEIGHT);
offDC.SelectObject(&bmpOff); // これによりoff screenはpDC
と同一のbitmapを有するようになる

// またこれにより背景を毎回黒で消去している。

// 現位置のボールの書き込み
memDC.SelectObject(&bmpBall[ball->pict]);

offDC.BitBlt(ball->c_pnt.x - 16,ball->c_pnt.y - 16,
ball->c_pnt.x + 16, ball->c_pnt.y + 16, &memDC, 0, 0,
SRCCOPY);

// ラケットの書き込み
if (racketHit>0) {
memDC.SelectObject(&bmpRacketEx);
racketHit--;
} else memDC.SelectObject(&bmpRacket);
offDC.BitBlt(racket->c_Rrect.left,racket->c_Rrect.top,
racket->c_Rrect.right,racket->c_Rrect.bottom, &memDC, 0, 0,
SRCCOPY);

for (int i=0; i<N_BLOCK; i++) { //ブロックの書き込み
if (block[i]->power>0) { //(消去は不要)
memDC.SelectObject(&bmpBlock[block[i]->power]);
offDC.BitBlt(block[i]->rct.left,block[i]-
>rct.top,block[i]->rct.right
,block[i]->rct.bottom,&memDC,0,0,SRCCOPY);
}
}

pDC->BitBlt(0,0,WIDTH,HEIGHT,&offDC,0,0,SRCCOPY); //一挙にpDCに転
送する

memDC.DeleteDC();
offDC.DeleteDC();
ReleaseDC(pDC);

static BOOL f_First = TRUE; //初回のみtimerがセットされるように
フラグをたてる
if (f_First == TRUE) {
f_First = FALSE;
SetTimer (TIMER_ID, TIC, NULL);
}
}

ご指導宜しくお願いします。


引用未解決
トピックタグ
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

CreateCompatibleBitmap で作ったビットマップって黒で初期化されるんでしたっけ?

offDC.SelectObject(&bmpOff);
offDC.FillSolidRect(0, 0, WIDTH, HEIGHT, RGB(0,0,0));

などとしておけばいいのでは。


返信引用
Beginner
 Beginner
(@Beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

kazuma様、

ご指導ありがとうございます。
小生のマシンでは確かに黒で初期化されます。
しかし、仰る通りこれは明示的ではありませんので、試みてます。
DDBでビットマップを作成していることは関係無いでしょうか。
DIBでも一度試みてみます。


返信引用
Beginner
 Beginner
(@Beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

kazuma様、

仰る通り他のマシンでもFillSolidRectを挿入しただけで解決しました。
ありがとうございました。
でも副作用としてFillSolidRectを挿入しなければランダムな頭痛を催すような背景が書かれる
ことを知りました。これは何かの効果に使えるかもしれません。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました