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に設定しないのでしょうか。
たびたび似たような質問で恐縮なのですが、何卒お願いします。
画面のちらつきを抑えるためです。
描画領域の大きいコントロールを作成し、BitBltあるバージョンと
ないバージョンで比較してみてください。
コピーメモリ?
設定?
これがどういう意味なのかによって回答が変わるな。
DCへDDBビットマップを直接描画する方法は無いみたい。
#俺が知らないだけ?
私はMFCは知らないのであしからず。
> なぜすぐに破棄するコピーメモリに一回設定してから、pDCにBitBltするのかよくわかりません。なぜ、直接、pDCに設定しないのでしょうか。
MSDNにメモリDCにしかビットマップを選択してはならないと書いてあります。
http://msdn2.microsoft.com/en-us/library/ms533272.aspx
後、メモリDCにビットマップを選択することはPixel転送とは意味が違います。そのメモリDCのフォーマット自体も変えてしまいます。
だからPixelデータだけじゃなく、幅や高さなどもその選択したビットマップと同じになります。
> DCへDDBビットマップを直接描画する方法は無いみたい。
> #俺が知らないだけ?
というわけで私も知りません。あったとしても使うか分からんけど。
返信、感謝です。
>MSDNにメモリDCにしかビットマップを選択してはならないと書いてあります。
気がつきませんでした。
できないんですね。
2、3日前からいろいろ勉強しているのですが、
いろいろ疑問だらけです。
先日、読んだ本(NT ADVANCED PROGRAMMING)だとメモリDCはWM_CREATEで作成して、終わりまで保持するのが賢い方法、と書いてあるのですが、他のどの本読んでもそんなことはなさそうだったり、、。HDCはあまり保持してはいけない、とは書いてあってもどうして駄目かは見つけられなかったり、、。
とりあえず、もろもろ作りながら勉強します。
ありがとうございました。
昔はメモリが不足していたからだな。
設定されたまま解放してもエラーはでないが
実際に解放されるのはプログラムが終了してから
ということがあるから解放の仕方には気を使うよ。
時代によって常識みたいなのって変わるんだよ。
OS内部の細かい動作はOSのバージョンアップで変わるだろう。
速度に差が出るとか
プログラミングが楽になるとかだったら賢いってことになるのだろうか。
俺はこの程度のこと対して賢いとは思わない。
ツイート | ![]() |