基本クラスを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
まで送信してください。