nさん ありがとうございます ちらつきで検索した結果
裏画面っていうのがあったのですが
一度OnPaintに描画させてそれをOnDrawに転送というやり方にしたいのですが
OnPaintにビットマップが描画できません
例などがあれば教えてもらえないでしょうか
>裏画面っていうのがあったのですが
>例などがあれば
そのトピックが例にならないですか?
void CxxxView::OnPaint()
{
CPaintDC dc(this);
CxxxDoc* pDoc = GetDocument();
CBitmap bitmap1,bitmap2;
bitmap1.LoadBitmap(IDB_BITMAP1);
bitmap2.LoadBitmap(IDB_BITMAP2);
CDC MemDC1,MemDC2;
CBitmap*poldBitmap1 = MemDC1.SelectObject(&bitmap1);
CBitmap*poldBitmap2 = MemDC2.SelectObject(&bitmap2);
MemDC1.BitBlt(0,0,500,500,&MemDC1,0,0,SRCCOPY);
MemDC1.BitBlt(pDoc->m_user1.x,pDoc->m_user1.y,48,48,&MemDC2,0,0,SRCCOPY);
MemDC1.SelectObject(poldBitmap1);
MemDC2.SelectObject(poldBitmap2);
}
void CxxxView::OnDraw(CDC* pDC)
{
CxxxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC MemDC1;
MemDC1.CreateCompatibleDC(pDC);
pDC->BitBlt(0,0,500,500,&MemDC1,0,0,SRCCOPY);
MemDC1.SelectObject(poldBitmap1);
}
これを動かすと何も表示されずに描画されるのですが
Bitmap1は背景画像で Bitmap2は単体の画像です。
期待通りに動作しないのは
OnPaint() では dc に何も描画していませんし、仮に
OnDraw() で何か描画できるとしても、
OnDraw() の MemDC1 にはあなたが描画したいビットマップを選択していない
からでしょう
OnPaintの
MemDC1.BitBlt(0,0,500,500,&MemDC1,0,0,SRCCOPY);
MemDC1.BitBlt(pDoc->m_user1.x,pDoc->m_user1.y,48,48,&MemDC2,0,0,SRCCOPY);
を
dc.BitBlt(0,0,500,500,&MemDC1,0,0,SRCCOPY);
dc.BitBlt(pDoc->m_user1.x,pDoc->m_user1.y,48,48,&MemDC2,0,0,SRCCOPY);
に書き換えてみたところ描画することができるのですがすごくちらつくのですが
どうすればメモリ上での描画ができるのでしょうか
今現在3つのDC
CPaintDC dc (実画面に対応)
CDC MemDC1 (ビットマップ1に対応 裏画面の一つ)
CDC MemDC2 (ビットマップ2に対応 裏画面の一つ)
があるようですが、実画面上でMemDC1とMemDC2の内容の混合を行っているために
その過程が見えてちらつくのです。
実画面と2つの裏画面との間にもう一つ裏画面を作り、そこで一度MemDC1とMemDC2の
内容の混合を済ませた後で、その内容を実画面に転送すればちらつきが無くなるはず
です。
※ちなみに裏画面DCには対応するビットマップを作成して選択しておく必要がありま
す。
MemDC3をなにもない(白紙のウインドウサイズ)裏画面用につくったとして
OnPaint()で
MemDC3.BitBlt(0,0,500,500,&MemDC1,0,0,SRCCOPY);
MemDC3.BitBlt(pDoc->m_user1.x,pDoc->m_user1.y,48,48,&MemDC2,0,0,SRCCOPY);
とやり
OnDrawで
pDC->BitBlt(0,0,500,500,&MemDC3,0,0,SRCCOPY);
とすればいいのでしょうか
>とすればいいのでしょうか
やってみればそれでいいかどうかすぐにわかると思いますが、どうですか?
そもそも、あなたがどのようにして再描画を促しているのかさえ不明なのですから
(適切な答えが欲しいのでしたら、あなたの状況が読む側に判る程度の内容を提示
する必要があると思いますけど、間違ってますか?)、ちらつく原因が特定できない
のであまり適切なことはお返事しかねます
それはそうと、 MFC + SDI で OnPaint() で描画するというのはあまり普通では
ないように思うのですけど、どうなんでしょうか(悪いといっているわけではありません)
すいません
void CxxxView::OnDraw(CDC* pDC)
{
CxxxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
SetTimer(1,10,NULL);
CDC MemDC3;
MemDC3.CreateCompatibleDC(pDC);
pDC->BitBlt(0,0,500,500,&MemDC3,0,0,SRCCOPY);
MemDC3.SelectObject(poldBitmap1);
}
void CxxxView::OnTimer(UINT nIDEvent)
{
Invalidate();
}
SetTimerを使い再描画をしています
やってみたところなにも描画されませんでした
あのー、OnPaint() と OnDarw() との関係についてどの程度ご理解なさっています
でしょうか
また、OnDraw() 内で SetTimer() する訳は何でしょうか
そして MemDC3 にビットマップを何も選択しないで BitBlt() するのは
何故なんでしょうか
OnPaint() と OnDarw() との関係って
OnPaint() が読み込まれてから
OnDarw() で描画じゃないですか
OnPaintはCWndクラスから継承されているメソッドですね。
すべてのウインドウはこのメソッドを持っています。
これに対してOnDrawは、この場合ならCViewクラスのメソッドです。
CViewはCWndから派生したクラスです。
CViewクラスのOnPaintの実装では、描画対象のCDCを取得し、
OnDrawを呼び出すということを行っているはずです。
LPOさんの実装では、CxxxViewクラス側でOnPaintのオーバーライドを
行っているので元のCView::OnPaintが呼び出されませんよね。
この辺が理解できないのであれば、C++言語の勉強をした方が良いと思います。
C++言語の知識なしでMFCを使ってもこういった部分が理解できないので
きちんと使いこなすことが出来ません。
CView系のOnDrawを持っているクラスで描画を行うのであれば、
OnPaintはオーバーライドせずにOnDrawに描画処理を実装するのが
MFCでは普通だと思いますよ。
もっと言ってしまうと、
CxxxViewクラス側でOnPaintのオーバーライドを行っていると
CView::OnPaintが呼ばれないので内部で読んでいるはずのCView::OnDrawも
呼び出されません。
こうなってしまうと自分で明示的にOnDrawを呼び出さないと駄目です。
>OnPaint() が読み込まれてから
>OnDarw() で描画じゃないですか
良くお分かりのようですので、あなたが示されたコードのどこで CxxxView::OnDraw() を
呼び出しているのか教えて下さい(Invalidate() の結果というのは無しですよ)
私にはあなたの CxxxView::OnPaint() が CxxxView::OnDraw() を呼び出しているようには
読めませんでした(OnPaint() が読み込まれてという言い回しで何がいいたいのか判らない
ところが気になりますが...)
void CxxxView::OnDraw(CDC* pDC)
{
CxxxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
SetTimer(1,10,NULL);
CBitmap bitmap3,bitmap1,bitmap2;
bitmap1.LoadBitmap(IDB_BITMAP1);
bitmap2.LoadBitmap(IDB_BITMAP2);
bitmap3.LoadBitmap(IDB_BITMAP3);
CDC MemDC1,MemDC2,MemDC3;
MemDC1.SelectObject(&bitmap1);
MemDC2.SelectObject(&bitmap2);
MemDC3.SelectObject(&bitmap3);
MemDC3.BitBlt(0,0,500,500,&MemDC1,0,0,SRCCOPY);
MemDC3.BitBlt(pDoc->m_user1.x,pDoc->m_user1.y,48,48,&MemDC2,0,0,SRCCOPY);
pDC->BitBlt(0,0,500,500,&MemDC3,0,0,SRCCOPY);
}
MemDC3は裏画面の画像につかいました。
タイマーをつかったのはキーボードで画像を動かすためにつかいました。
こうすると動いたのですが描画するとちらつきがでてきます
何か対処策はありますか