VC++6.0でビットマップファイルに文字データを書き込むというソフトを作っています。
エディットコントロールを表示させ、文字データを書き込むということには成功しまし
た。
dlgクラスで、SetModifiedFlagをTRUEにして、終了するときにファイルが変更されて
います、というメッセージが出ますが、それを実行すると、コードを何も記述してないの
ですから当たり前ですが、空のファイルが保存されます。
そこで独自に OnDestroy 関数を作ってそこで保存の処理をしようとしていますが、そこ
で処理する前に、アプリケーションの終了や右上の×を選択して終了しようとすると、
OnDestroy関数が呼び出される前に、ウィンドーズ備え付けのダイアログが出てしまい
ます。
シリアライズ関数をコメントアウトして実現しようとしましたが、エラーが出て色々試し
ましたが、駄目でした。
プログラムを終了する前に唯一表示される関数がOnDestroy 関数になるようにするにはど
うしたらいいのでしょうか。よろしくお願いします。
VC6は無いので具体的なアドバイスにはなりません。あしからず。
まず、SetModifiedFlagとは、CDocument::SetModifiedFlag(BOOL)でしょうか。
であれば
仮定1.「MFCを使用している」
でよろしいですか。
次に、ビットマップをファイルに保管する件ですが、
自前でコードする場合は、対象ビットマップをDIB又は
DIBSECTIONに変換し、BITMAPFILEHEADERから保管することに
なりますが、これを自前でコードするのは結構大変です。
最も簡単なのは、CImageクラスを使用する方法となりますが、
VC6.0の頃のライブラリにCImageが含まれていたかどうかを失念しました。
また、CImageは、CObjectから派生していないので、Serialize()
メソッドを継承していません。独自にファイル名を指定して、
保管する必要があると考えられます。
さて、CImageが使えるのなら、とりあえず、
1.ビットマップを読み込む
2.ファイル名を指定して、読み込んだビットマップを保存する。
ところまで、コードしてみてはどうでしょう。
仲澤@失業者 様ありがとうございます。
ここまで出来ています。ダウンロードしてみて見てください。
http://www1.axfc.net/u/3163122.zip
XPでのみ動作を確認しています。
VS2003以降のMFCとVC6の頃のMFCは大きく異なります。
先の発言にあるようにVC6がないので、
ダウンロードしても評価できません。
あしからず。
仲澤さん、
実行ファイルのみでした。
>OnDestroy関数が呼び出される前に、ウィンドーズ備え付けのダイアログが出てしまい
>ます。
Windowsの仕様ですね。
そのメッセージを出さないようにするのはかなり難しいと思います。
「BOOL IsModified();」で調べて手動でメッセージ出す方法はどうですか?
CDocument::SaveModified の説明を読んでみて........
内容からして、MFC-SDI or MFC-MDI かな?
SetModifiedFlag(TRUE)したなら、そのまま普通にMFC流がよさげ。
OnDestroy()で処理したいなら、SetModifiedFlag(TRUE)はやめるのがよさげ。
前者であれば、CDocument::OnSaveDocument()をオーバーライドしましょう。
CDocument::OnSaveDocument()はふつーに考えて、保存確認をして欲しい
タイミングでばっちり呼ばれるはずです。
ITO さん bun さんありがとうございます。
bun さんのおっしゃるとおり MFC-SDI です。
SDKなら、始めから全部自分で作るのでこんなことは無いと思うのですが、MFCですので気
を利かせたつもりなのでしょうが、前もって色々と仕組みが出来ているので厄介です。
ITOさんの
>Windowsの仕様ですね。
>そのメッセージを出さないようにするのはかなり難しいと思います。
という事のようですので、あきらめるしかないのかなとも思っております。
DIBの保存も、テキストファイルの保存も全部出来ているのに、ここであきらめるのはつ
らいのですが、それしかないように思われます。
一応 bun さんの
>CDocument::OnSaveDocument()をオーバーライドしましょう。
を試してみようと思っています。
皆さんありがとうございました。