DIBとDDB

[戻る]
Beginner 2003/02/21(金) 18:36:26
いつもお世話になります。
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 2003/02/22(土) 00:44:10
CreateCompatibleBitmap で作ったビットマップって黒で初期化されるんでしたっけ?

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

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

Beginner 2003/02/22(土) 06:47:10
kazuma様、

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

Beginner 2003/02/22(土) 09:45:39
[[解決]]
kazuma様、

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

古いスレッドには追加発言できません。