画面のチラツキを防ぐには – 固定ページ 2 – プログラミング – Home

画面のチラツキを防ぐには
 
通知
すべてクリア

[解決済] 画面のチラツキを防ぐには

固定ページ 2 / 2

dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

>何が悪いでしょうか。ご教授下さい。

oDCに画面の内容を描画するためのビットマップが設定されていません。

それと、GetDC()でゲットするばかりで、ReleaseDC()しないのも
後々問題となるでしょう。

ところで、ビットマップを描きたいだけなら、
mDCを用意しなくても、oDC.DrawState()で可能です。


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

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);
}


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

>①off screenを用いるのであれば、前のブロック位置を消去する必要が無いのでしょうか。

毎回off screenを新しく作っている(CreateCompatibleBitmap)ためです。
1つのoff screenを使いまわす場合は、消去しなければなりません。

>②背景をSolidBrushで設定しているつもりなのですが、真黒のままなのは何故でしょうか。

offBrushで塗りつぶした後でoff screenをセットしているためです。

ビットマップの読込みや作成は、塗ったりコピーしたりに比べると
相当時間のかかる処理です。現在の方法が理解できたのでしたら、
ビットマップを使いまわすように工夫することをお勧めします。


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

dairygoods様、

懇切丁寧にありがとうございました。
ここ数日の悩みがやっと解決した気分です。
ご指摘のように「使い回し」について試みたいと思います。
また、他の方々もご指導有難うございました。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

1 は、広いビットマップをウィンドウ全体にBitBlt()している為
2 は、bmpOffをoDCに選択する前にFillRect()している為

だと思われます。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

外しました。


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

n様、

1と2は互いに関連しているものと推測します。
多分、off screenでその部分のみ書き込めば良いのですね。
ありがとうございます。


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

既に解決済みですが、あえて追加します。②について解決しました。
文の順番を以下のように置き換えたのみです。

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);
}


返信引用
あいちゅん
 あいちゅん
(@あいちゅん)
ゲスト
結合: 22年前
投稿: 2
 

メモリDCを使うと
読み込んだデータの流れはどうなってるのですか?
最初の段階でメモリ上のビットマップに描かれるのですか?
1画素ずつ、順番にデータが反映されるのでしょうか?
メモリDCの役割がいまいち、しっくりきません
どうか、教えていただけないでしょうか?


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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