①のように直接画面に描画する場合、正常に描画できるのですが、
②のように裏画面(cdcSubDC)に描画して最終的にメインの画面にBitBltしようとすると、
うまくいきません。
裏画面に描画する方法で間違えているところなどあるのでしょうが、いまいち解りません。
間違いを教えてくれ問題解決に導いてくれたかたに500ポイント差し上げます。
救いの手をよろしくお願いします。
①
CDC* cdcMainDC=wndIcon->GetDC();
・
・
(省略)
・
・
ipi->Render(cdcMainDC->m_hDC,0,0,csz.cx,csz.cy,0,hit,wid,-hit,NULL);//描画します。
②
CDC cdcSubDC; //裏画面用CDC
cdcSubDC.CreateCompatibleDC(cdcMainDC);
CBitmap GraphicMap;
ipi->get_Width(&wid);//イメージのサイズを取得します。
ipi->get_Height(&hit);
CSize csz(wid,hit);
GraphicMap.CreateCompatibleBitmap(pDC ,wid,hit);//キャンバス準備
cdcSubDC.SelectObject(GraphicMap); //裏画面との関連付け
cdcSubDC.HIMETRICtoDP(&csz);
ipi->Render(pDC->m_hDC,0,0,csz.cx,csz.cy,0,hit,wid,-hit,NULL);//描画します。
ipi->Release();//イメージを解放します。
ist->Release();//ストリームを解放します。
GlobalFree(hgb);//読み込み用バッファを解放します。
cdcSubDC.SelectObject(oldBMP);
中途半端にしか読めていませんが、cdcMainDC->BitBlt( 0, 0, csz.cx, csz.cy, &cdcSubDC, 0, 0, SRCCOPY );
は実行しているとのことなので。
まず気になるのは、ipi->Renderの第1引数。pDCは定義されていないので気になります。cdcSubDCのm_hDCがちゃんと指定できていますか?気になったのはこれだけです。
なげやりで申し訳ありませんが、以下、調べたほうがよさそうな点をいくつか。
Renderメソッド直前で、念のためにパラメータ(cxz.cyなど)の値を調べてみるのが最善かと思います。
また、Renderで描画する座標をわざとずらすのもありかと思います。もしかしたら、第7引数を0、第9引数をhitにするのが正しい場合もありますので。
あと、これは個人的に。ダブルバッファリングをするだけなら、「cdcSubDC.SelectObject(oldBMP)」は不要なように思います。
場合によっては、Renderの最終引数のRectをちゃんと指定しなければ表示できない場合もあるそうです。
調査不足ですみませんが。どうぞ頑張ってください。
リンクは参考までに。
回答ありがとうございます。
>>まず気になるのは、ipi->Renderの第1引数。pDCは定義されていないので気になります
>>。cdcSubDCのm_hDCがちゃんと指定できていますか?気になったのはこれだけです。
>>なげやりで申し訳ありませんが、以下、調べたほうがよさそうな点をいくつか。
ああぁっ
メイン画面に出力できるかテストしたときのコーディングを直していませんでした。
見苦しい失敗申し訳ありません。
Renderの第一引数はcdcSubDC.m_hDCです。
そして
変数の値や関数の意味を確認しながら、いろいろ試していたところ無事解決することができました。
今回のソースの問題点はwid,hitを
HIMETRICtoDP関数を通しピクセルの値に変換してから
CreateCompatibleBitmap(pDC ,wid,hit)とするべきところを
そうしていなかったことが原因のようです。
ピクセル値に変換する前は、widに20000とか大きい値が入っていましたが
ここを直したら正常に画像を表示することができました。
SevenSさんのコメントが力になりました。
今回はヒントという形でしたので
250ポイントになりますが、感謝の心をもって差し上げます。
ありがとーございました。