CreateCompatibleDCの使い方について教えてください。

解決


馬場  2006-12-14 20:30:58  No: 63955

CreateCompatibleDCの良くあるサンプルとして、

void CxxxView::OnDraw(CDC* pDC)
{
  CDC dcMemory;
  dcMemory.CreateCompatibleDC(pDC);
  dcMemory.SelectObject(&bmp);// bmpは少し前に取得
  pDC->BitBlt(X, Y, Width, Height, &dcMemory, 0, 0, SRCCOPY);
}

というのがあるのですが、なぜすぐに破棄するコピーメモリに一回設定してから、pDCにBitBltするのかよくわかりません。なぜ、直接、pDCに設定しないのでしょうか。

たびたび似たような質問で恐縮なのですが、何卒お願いします。


keichan  2006-12-14 23:30:29  No: 63956

画面のちらつきを抑えるためです。
描画領域の大きいコントロールを作成し、BitBltあるバージョンと
ないバージョンで比較してみてください。


超初心者  2006-12-15 07:41:42  No: 63957

コピーメモリ?
設定?
これがどういう意味なのかによって回答が変わるな。

DCへDDBビットマップを直接描画する方法は無いみたい。
#俺が知らないだけ?


michi  2006-12-15 08:17:25  No: 63958

私はMFCは知らないのであしからず。

> なぜすぐに破棄するコピーメモリに一回設定してから、pDCにBitBltするのかよくわかりません。なぜ、直接、pDCに設定しないのでしょうか。

MSDNにメモリDCにしかビットマップを選択してはならないと書いてあります。
http://msdn2.microsoft.com/en-us/library/ms533272.aspx

後、メモリDCにビットマップを選択することはPixel転送とは意味が違います。そのメモリDCのフォーマット自体も変えてしまいます。
だからPixelデータだけじゃなく、幅や高さなどもその選択したビットマップと同じになります。

> DCへDDBビットマップを直接描画する方法は無いみたい。
> #俺が知らないだけ?

というわけで私も知りません。あったとしても使うか分からんけど。


馬場  2006-12-15 13:55:07  No: 63959

返信、感謝です。

>MSDNにメモリDCにしかビットマップを選択してはならないと書いてあります。
気がつきませんでした。
できないんですね。

2、3日前からいろいろ勉強しているのですが、
いろいろ疑問だらけです。

先日、読んだ本(NT ADVANCED PROGRAMMING)だとメモリDCはWM_CREATEで作成して、終わりまで保持するのが賢い方法、と書いてあるのですが、他のどの本読んでもそんなことはなさそうだったり、、。HDCはあまり保持してはいけない、とは書いてあってもどうして駄目かは見つけられなかったり、、。

とりあえず、もろもろ作りながら勉強します。
ありがとうございました。


超初心者  2006-12-15 17:31:57  No: 63960

昔はメモリが不足していたからだな。

設定されたまま解放してもエラーはでないが
実際に解放されるのはプログラムが終了してから
ということがあるから解放の仕方には気を使うよ。

時代によって常識みたいなのって変わるんだよ。
OS内部の細かい動作はOSのバージョンアップで変わるだろう。

速度に差が出るとか
プログラミングが楽になるとかだったら賢いってことになるのだろうか。
俺はこの程度のこと対して賢いとは思わない。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加