• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:OnDraw以外でクライアント領域をBMPに保存できない)

OnDraw以外でクライアント領域をBMPに保存できない

このQ&Aのポイント
  • MFCでクライアント領域の画像をBMPファイルに保存する方法はOnDraw以外で実現できないのか?
  • OnDraw関数に記述すると最初の1ステップ目のみファイルが出力される現象が発生している
  • 有用なライブラリや参考URLなどがあれば教えてほしい

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>下記サブルーチンを作成しましたが、 C++なんだからサブルーチンだなんていわないで・・・ >ファイルができません。 どうやってここの処理を呼び出しているのでしょう? あと、エラー処理が何にも無いんですが、どこで エラーになっているか位調べましたか? 1ステップ目だけでも描画した結果が取得できて ビットマップファイルが作成できることがあるという のであれば、ファイルを作成して保存している個所の ソースを挙げられても意味が無いのでは?

zico2
質問者

補足

ご教示ありがとうございます。 10ステップ毎の書き出しは 下記のメンバ関数で行っています。 また、ファイル作成時のソースを記述しましたのは、 1回目の処理にメモリ上なんらかのミスがあったために、 2回目以降に書き出しが行われないのではないかと 推測したためです(ReleaseDC,DeleteObject等)。 しかし、マウスクリック(View::OnLbuttonDown) とbmp書きだしをリンクさせたところ、何枚でも書き出せることが分かりました。 ということは、whileループでだけ 書き出しできていないことになります。 トレースしたところ、書き出しルーチンには入っており、 エラーは出ていません。 よろしくお願いします。 bool MyView::ViewResult(char* filename1) { fp=fopen(filename1,"r"); fgets(buff,255,fp); while(fgets(buff,255,fp) != NULL){ sscanf(buff,"%2s%2s%15le",&dum1,&dum2,&(pDoc->m_MPSM.m_time)); fscanf(fp,"%15d\n",&(pDoc->m_MPSM.m_NP)); int fout; for( i = 0 ; i < pDoc->m_MPSM.m_NP ; i++){ fgets(buff,255,fp); fout = sscanf(buff,"%15i,%15le,%15le,%15le,%15le,%15le,%15le,%15le,%15le,%15i", &(pDoc->m_MPSM.m_p[i].m_Velocity.x), &(pDoc->m_MPSM.m_p[i].m_Velocity.y), &(pDoc->m_MPSM.m_p[i].m_Velocity.z), }   //画面更新 this->Invalidate(true); this->UpdateWindow(); sprintf(filename2, "Auto%.0lf.bmp", pDoc->m_MPSM.m_time*1000); if(int(pDoc->m_MPSM.m_time * 1000) % 10 == 0){ //bmpファイル書き出し WriteWindowToDIB( filename2, this); } }//while loop fclose(fp); }

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>OnDraw関数に記述すると、 >最初の1ステップ目のみファイルが出力されます??? >  //画面更新 > this->Invalidate(true); > this->UpdateWindow(); 原因はこの2行、特にUpdateWindow()だと思います。 UpdateWindowは、呼びだされたら即座に描画を行います。 MFCでは、OnDrawが直接呼び出されます。 このため、最初の1ステップ目のみしか記録されていないファイルが出来ます。 というか、OnDrawの中でInvalidate()もUpdateWindow()も呼んではいけません。OnDrawは、描画をするためのハンドラです。描画をするハンドラの中で無効領域を作ったり再描画の指示なんて出したら無限ループの元です。

zico2
質問者

お礼

ご教示ありがとうございます。 私の説明が舌足らずですみません。 この2行は、OnDraw関数の中で呼んでいません。 Viewの他のメンバ関数内で呼び出しています。 今まで、bmp書きだしルーチンに問題があると ばかり思いこんでいたのですが、 ご指摘を受けて、View周りを注意深くトレースして チェックしていましたら、 bmpファイルがアプリケーション起動ディレクトリ以外の ディレクトリに書き出されていることが分かりました。 最初の1枚だけカレントディレクトリに書き出されて、後は、他のディレクトリにありました。 途中で、CFileDialogを使ったことにより、 カレントディレクトリが変わってしまったようです。 bmpの書き出しルーチン自体は問題なかったようなのです。 この数日間悩み続けていたことが解決できました。 1人で悩んでいても3日も4日も解決しなかったのですが、ご指摘頂いたことが解決への糸口となりました。 本当にどうもありがとうございました。

関連するQ&A