基本クラスをCEditViewにした時の
上書き確認ダイアログ消去方法




基本クラスをCEditViewにした場合、キーボード入力はもちろんのこと、ReplaceSel()関数を 使ってテキスト表示を行なっても、終了時に保存するかどうかの確認ダイアログが表示されて しまいます。
これはSetModify()関数を使ってクリアしても、表示されてしまいます。
そこで、VisualStudioを使っている場合の裏技のような方法で回避します。

1.ドキュメントクラスのヘッダファイルに赤文字の行を追加します。
(File:WinTailDoc.h)
    //オーバーライド
    // ClassWizard は仮想関数のオーバーライドを生成します。
    // {{AFX_VIRTUAL(CWinTailDoc)
    public:
    virtual BOOL OnNewDocument();
    //}}AFX_VIRTUAL
    
    // 終了時に上書き保存の確認ダイアログを表示させない為のオーバーライド
    virtual    BOOL    SaveModified();
    


2.そして、その関数の実体をドキュメントクラスのソースに追加します。
(File:WinTailDoc.cpp)
    /////////////////////////////////////////////////////////////////////////////
    // CWinTailDoc コマンド
    
    // 終了時に上書き保存の確認ダイアログを表示させない為のオーバーライド
    BOOL    WinTailDoc::SaveModified()
    {
        return( TRUE );
    }
    

なぜ、これで回避できるのかと言いますと、CMainFrameクラスが終了する時は必ず CMainFrame::OnClose()関数が動きます。
それは試しにクラスウィザードからOnCloseを追加すれば分かると思います。
そのOnClose()関数をデバッガでトレースしていくと、Winfrm.cppというファイルの中の CFrameWnd::OnClose()関数に飛んでいます。この中のSaveAllModified()という関数を 使って上書き更新ダイアログを表示させているのです。
最初は無理矢理、Winfrm.cppファイルを一時的に書き換えてやろうかと思ったのですが、 それはやっぱり、人としてやってはいけない事と思って断念しました。
そこで登場するのがオーバーライドという方法です。SaveModified()関数がコールされた時は、 標準の関数ではなくて、自前で用意した必ずTRUEで返る関数をコールするように変更します。 これにより、確認ダイアログで「いいえ」がクリックされたのと同じ動きになるのです。




N総研ソフトウェア開発部のTOPに戻る。

このページに関するご意見・質問は
ドンタコスN村 E-mail:wnaka@coco.ned.co.jp
まで送信してください。