OnDestroy 関数を表示させるには

[戻る]
よし 2014/02/04(火) 14:38:18
VC++6.0でビットマップファイルに文字データを書き込むというソフトを作っています。

エディットコントロールを表示させ、文字データを書き込むということには成功しまし
た。

dlgクラスで、SetModifiedFlagをTRUEにして、終了するときにファイルが変更されて

います、というメッセージが出ますが、それを実行すると、コードを何も記述してないの

ですから当たり前ですが、空のファイルが保存されます。

そこで独自に OnDestroy 関数を作ってそこで保存の処理をしようとしていますが、そこ
で処理する前に、アプリケーションの終了や右上の×を選択して終了しようとすると、

OnDestroy関数が呼び出される前に、ウィンドーズ備え付けのダイアログが出てしまい

ます。



シリアライズ関数をコメントアウトして実現しようとしましたが、エラーが出て色々試し
ましたが、駄目でした。

プログラムを終了する前に唯一表示される関数がOnDestroy 関数になるようにするにはど
うしたらいいのでしょうか。よろしくお願いします。

仲澤@失業者 2014/02/04(火) 17:19:48
VC6は無いので具体的なアドバイスにはなりません。あしからず。

まず、SetModifiedFlagとは、CDocument::SetModifiedFlag(BOOL)でしょうか。
であれば

 仮定1.「MFCを使用している」

でよろしいですか。

次に、ビットマップをファイルに保管する件ですが、
自前でコードする場合は、対象ビットマップをDIB又は
DIBSECTIONに変換し、BITMAPFILEHEADERから保管することに
なりますが、これを自前でコードするのは結構大変です。

最も簡単なのは、CImageクラスを使用する方法となりますが、
VC6.0の頃のライブラリにCImageが含まれていたかどうかを失念しました。

また、CImageは、CObjectから派生していないので、Serialize()
メソッドを継承していません。独自にファイル名を指定して、
保管する必要があると考えられます。

さて、CImageが使えるのなら、とりあえず、

 1.ビットマップを読み込む
 2.ファイル名を指定して、読み込んだビットマップを保存する。

ところまで、コードしてみてはどうでしょう。

よし 2014/02/04(火) 19:28:32
仲澤@失業者 様ありがとうございます。



ここまで出来ています。ダウンロードしてみて見てください。



http://www1.axfc.net/u/3163122.zip



XPでのみ動作を確認しています。

仲澤@失業者 2014/02/05(水) 11:22:21
VS2003以降のMFCとVC6の頃のMFCは大きく異なります。
先の発言にあるようにVC6がないので、
ダウンロードしても評価できません。
あしからず。

ITO 2014/02/05(水) 13:24:26
仲澤さん、
実行ファイルのみでした。

>OnDestroy関数が呼び出される前に、ウィンドーズ備え付けのダイアログが出てしまい
>ます。
Windowsの仕様ですね。
そのメッセージを出さないようにするのはかなり難しいと思います。

「BOOL IsModified();」で調べて手動でメッセージ出す方法はどうですか?

CDocument::SaveModified の説明を読んでみて........

bun 2014/02/05(水) 15:01:05
内容からして、MFC-SDI or MFC-MDI かな?

SetModifiedFlag(TRUE)したなら、そのまま普通にMFC流がよさげ。
OnDestroy()で処理したいなら、SetModifiedFlag(TRUE)はやめるのがよさげ。

前者であれば、CDocument::OnSaveDocument()をオーバーライドしましょう。
CDocument::OnSaveDocument()はふつーに考えて、保存確認をして欲しい
タイミングでばっちり呼ばれるはずです。

よし 2014/02/05(水) 17:32:22
[[解決]]
ITO さん bun さんありがとうございます。



bun さんのおっしゃるとおり MFC-SDI です。

SDKなら、始めから全部自分で作るのでこんなことは無いと思うのですが、MFCですので気
を利かせたつもりなのでしょうが、前もって色々と仕組みが出来ているので厄介です。



ITOさんの

>Windowsの仕様ですね。

>そのメッセージを出さないようにするのはかなり難しいと思います。

という事のようですので、あきらめるしかないのかなとも思っております。



DIBの保存も、テキストファイルの保存も全部出来ているのに、ここであきらめるのはつ
らいのですが、それしかないように思われます。



一応 bun さんの

>CDocument::OnSaveDocument()をオーバーライドしましょう。

を試してみようと思っています。



皆さんありがとうございました。

古いスレッドには追加発言できません。