>何が悪いでしょうか。ご教授下さい。
oDCに画面の内容を描画するためのビットマップが設定されていません。
それと、GetDC()でゲットするばかりで、ReleaseDC()しないのも
後々問題となるでしょう。
ところで、ビットマップを描きたいだけなら、
mDCを用意しなくても、oDC.DrawState()で可能です。
dairygoods 様、
ご教授ありがとうございます。
以下のようにして何とかなりましたが、
①off screenを用いるのであれば、前のブロック位置を消去する必要が無いのでしょうか。
実際にその操作をせずとも移動していきます。
②背景をSolidBrushで設定しているつもりなのですが、真黒のままなのは何故でしょうか。
void COffScreenTestDlg::OnTimer(UINT nIDEvent)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォル
トの処理を呼び出してください
if (nIDEvent==1) {
point.x+=5;
point.y+=3;
CDC *pDC = GetDC();
CDC mDC;
CBitmap bmpBlock;
CBitmap bmpBlockBlue;
// CBitmap *bmpOld1, *bmpOld2;
mDC.CreateCompatibleDC(pDC);
bmpBlock.LoadBitmap(IDB_BLOCK);
bmpBlockBlue.LoadBitmap(IDB_BLOCKBLUE);
mDC.SelectObject(&bmpBlock);
// off Screenの準備
CBitmap bmpOff;
bmpOff.CreateCompatibleBitmap(pDC,1000,800);
CDC oDC;
oDC.CreateCompatibleDC(pDC);
CBrush offBrush;
offBrush.CreateSolidBrush(RGB(100,50,255));
CRect r;
r.top=0;
r.left=0;
r.bottom=800;
r.right=1000;
oDC.FillRect(r,&offBrush);
oDC.SelectObject(&bmpOff);
//
oDC.BitBlt
(point.x,point.y,point.x+32,point.y+32,&mDC,0,0,SRCCOPY);
mDC.SelectObject(&bmpBlockBlue);
oDC.BitBlt
(point.x*2,point.y*2,point.x*2+32,point.y*2+32,&mDC,0,0,SRCCOPY);
// mDC.SelectObject(bmpOld1);
// oDC.SelectObject(bmpOld2);
pDC->BitBlt(0,0,1000,800,&oDC,0,0,SRCCOPY);
if (point.x>500) point.x=0;
if (point.y>400) point.y=0;
oldPoint=point;
ReleaseDC(pDC);
}
CDialog::OnTimer(nIDEvent);
}
>①off screenを用いるのであれば、前のブロック位置を消去する必要が無いのでしょうか。
毎回off screenを新しく作っている(CreateCompatibleBitmap)ためです。
1つのoff screenを使いまわす場合は、消去しなければなりません。
>②背景をSolidBrushで設定しているつもりなのですが、真黒のままなのは何故でしょうか。
offBrushで塗りつぶした後でoff screenをセットしているためです。
ビットマップの読込みや作成は、塗ったりコピーしたりに比べると
相当時間のかかる処理です。現在の方法が理解できたのでしたら、
ビットマップを使いまわすように工夫することをお勧めします。
dairygoods様、
懇切丁寧にありがとうございました。
ここ数日の悩みがやっと解決した気分です。
ご指摘のように「使い回し」について試みたいと思います。
また、他の方々もご指導有難うございました。
1 は、広いビットマップをウィンドウ全体にBitBlt()している為
2 は、bmpOffをoDCに選択する前にFillRect()している為
だと思われます。
外しました。
n様、
1と2は互いに関連しているものと推測します。
多分、off screenでその部分のみ書き込めば良いのですね。
ありがとうございます。
既に解決済みですが、あえて追加します。②について解決しました。
文の順番を以下のように置き換えたのみです。
CDC oDC;
oDC.CreateCompatibleDC(pDC);
CBrush offBrush;
offBrush.CreateSolidBrush(RGB(100,50,255));
CRect r;
r.top=0;
r.left=0;
r.bottom=800;
r.right=1000;
oDC.SelectObject(&bmpOff); //ここの順番を変更しました
oDC.FillRect(r,&offBrush); //これにより背景色がちゃんと維持され
ました
//
oDC.BitBlt
(point.x,point.y,point.x+32,point.y+32,&mDC,0,0,SRCCOPY);
mDC.SelectObject(&bmpBlockBlue);
oDC.BitBlt
(point.x*2,point.y*2,point.x*2+32,point.y*2+32,&mDC,0,0,SRCCOPY);
// mDC.SelectObject(bmpOld1);
// oDC.SelectObject(bmpOld2);
pDC->BitBlt(0,0,1000,800,&oDC,0,0,SRCCOPY);
if (point.x>500) point.x=0;
if (point.y>400) point.y=0;
oldPoint=point;
ReleaseDC(pDC);
}
メモリDCを使うと
読み込んだデータの流れはどうなってるのですか?
最初の段階でメモリ上のビットマップに描かれるのですか?
1画素ずつ、順番にデータが反映されるのでしょうか?
メモリDCの役割がいまいち、しっくりきません
どうか、教えていただけないでしょうか?