MFCのダイアログベースアプリケーションの中で
モードレスフォームを作りました。
void CTestDlg::OnButton1()
{
m_pDlg->ShowWindow(true);
}
void CTestDlg::OnButton2()
{
m_pDlg->ShowWindow(false);
}
と、したいので、
BOOL CTestDlg::OnInitDialog()
{
略
m_pDlg = new CnewDialog1(this);
m_pDlg->Create(IDD_DIALOG1);
return TRUE;
}
このように記述しました。
アプリケーション終了時に
DestroyWindow();
や、deleteを正しく行いたいのですが
どこに何をどう記述することが適切でしょうか?
いくつか適切な方法があるのかもしれません。
HELPの何を調べれば
サンプルを読める等のヒントでもよいので
よろしければ、教えてください。
> 他言語の初心者ではないですよ。
> 何百人単位で人に教えてる。
こんな発言してた人の質問とも思えんのですが。
書籍をあたるなり、webで適切なキーワードで検索すれば、ここで返答を待っている間にでも解決できませんか?
某動物系サイトの講座でそのものズバリのものも出ているんですが。
少しは調べました?
こんにちは。
検索しても、
本当に適切にダイアログを破棄をする為のコードの
どれが正しい情報なのかを取捨選択するのが難しいです。
下記は見ました。
求める情報そのものが載っているわけではなさそうでした。
http://madia.world.coocan.jp/vc/vc_bbs/200311/200311_03110042.html
http://www.ccad.sist.chukyo-u.ac.jp/~mito/ss/program/C/DialogBase/app/genDlg/index.htm
読み切れてないかもしれません。
void CTestDlg::OnClose()
{
m_pDlg->DestroyWindow();
delete m_pDlg;
CDialog::OnClose();
}
このようにイベントに記述する事で
正しく破棄されますか?
他の場所に書くことも出来るとは思っていますが
どこに書くやり方が主流でより正しいコードになるのでしょう。
動物系とは「猫でもわかる」のページの事ですか?
MFCの事は書かれていない気がしますが、書かれていたらすいません。
その他の場所も探し切れていませんので
ご存じのURLあれば教えてください。
CWnd::OnClose()はウィンドウの右上のペケを押したときしか処理しないはずです。
この場合OnDestroy()で処理するほうが適切かと思います。
とある書籍に載っていたモードレスダイヤログの使い方では、CDialogの派生クラスのコンストラクタでCreateして、CWnd::PostNcDestroyで自身をdeleteするような方法もあります。
CMyDialog::CMyDialog(UINT nID, CWnd* pParent)
{
Create(nID, pParent);
}
void
CMyDialog::PostNcDestroy()
{
delete this;
}
今回のようなケースの場合、親ダイヤログのデストラクタでdeleteするのが確実に破棄出来ると思います。
コンストラクタでNULLを代入、OnCreateでnewとCreate、OnDestroyでDestroyWindow、デストラクタでdeleteというのが私のやり方です。
最もよい方法化はわかりませんが、ご参考までに。。。
ググれカス!
しっかし…チャレンジャーだね、あんたw
まあ「とおりすがり」や「名無し」で無責任な書き込みをする奴よりは
ある意味天晴れだなw
そんなのいたっけ?
ゴンさんありがとうございました。
ヒントを頂いてわかってきました。
PostNcDestroyで検索して勉強します。
ググれカスって何でしたっけ昔の哲学者ですか!?
あ?さんのリンクでは、ググれさんは正しく答えません。
代わりに聞いて欲しいというのも厚かましいお願いですが
検索単語のヒントを頂きたい。
MFCか非MFCか.NETかも見分けなければいけないのですね
情報が多すぎて、適切な情報なのかどうかを
見極める事が、きっと皆さんには簡単だと思いますが
私にはまだ難しいです。
自分で説明しておいてなんですけれど、PostNcDestroyを使って自身を破棄する方法は今回のようなケースには不向きだと思います。
あくまでひとつの方法として参考にしてもらえればと思います。
ちなみに2つの方法を説明しましたが、PostNcDestroyを使って自身を破棄する方法はダイヤログのポインタを保存せずフォーカスを失ったりした際に自滅してくれるウィンドウを作るのに有効です。
ですが、実装によってはポインタエラーなどの問題が生じやすい方法です。
一方、コンストラクタでnewしてデストラクタでdeleteする方法は親ウィンドウが破棄された際に確実に破棄されますので、比較的問題が生じにくいと思います。
「MFC モードレスダイアログの作成」でググれば丁度よさそうなサイトがあります。
> ググれカスって何でしたっけ昔の哲学者ですか!?
一度謝罪したのなら挑発に乗らず無視すべきです。
双方とももう少し建設的な掲示板の使い方をしていただければと思います。
VC++6.0の例ですが、ご参考までに。
http://athomejp.com/goldfish/mfc/dialog/modeless.asp
ゴンさん、名無しさん、
レスありがとうございます。
> 双方とももう少し建設的な掲示板の使い方をしていただければと思います。
その通りですね。すいませんでした。
OnDestroy()で処理する事にしました。
ツイート | ![]() |