2016-11-14 4 views
0

OKボタンをクリックすると、MFCダイアログフォームはどうなりますか?それはコンストラクタが実行されていないので破壊されていないように見えます。私はこのフォームへのポインタを持っていますStatusDlg * statusDlg;。このフォームを知る方法は見えませんか?このフォームをもう一度使用してユーザーに表示するにはどうすればよいですか? このフォームを完全に破壊するには?OKボタンをクリックした後でMFCダイアログフォームがどうなるのですか

は、私は次のようにそれを作成します。

statusDlg = new StatusDlg(NULL); 
statusDlg->Create(StatusDlg::IDD,CWnd::GetDesktopWindow()); 
statusDlg->ShowWindow(SW_SHOW); 

そして、それが作成されたとき、私はOKを押します。

+1

作成した後、次に何をしましたか?あなたはそれが表示されることを期待していましたか? – rrirower

+0

もっとコードを表示する。 –

+0

*「このフォームを知る方法は見えませんか?」* - [CWnd :: IsWindowVisible](https://msdn.microsoft.com/library/49a832ee-bc34-4126-88b3-bc1d9974f6c4.aspx# cwnd__iswindowvisible)はその情報を返します。また、これまでに何度も説明したように、Windows APIに精通していなければ、MFCに習熟することはできません。あなたは、このような小さな問題と小さな問題を抱えています。デバッガの使い方がわからない場合は、どちらかといえば役に立たないでしょう。 – IInspectable

答えて

0

「コンストラクタは実行されていません」という意味は分かりません...デストラクタが実行されていないと言っていると思います。

これは本当です。

結局のところ、ダイアログボックスでAPI関数EndDialog(m_hWwnd, IDOK)が呼び出されるとどうなりますか。これにより、ダイアログが非表示になります。

ただし、ダイアログのウィンドウハンドルとそのポインタは有効です。プログラムの終了時に、ウィンドウは破棄されますが、C++デストラクタは依然として呼び出されません。

void StatusDlg::PostNcDestroy() 
{ 
    __super::PostNcDestroy();// might be able to be skipped if baseclass does nothing, which I suspect is the case 
    delete this; // deletes this StatusDlg 
} 

あなたstatusDlgポインタがウィンドウが表示されているかどうかを伝えることができます:あなたは、あなたのデストラクタが呼び出されるようにしたい場合は、このようなPostNcDestroy()をoverried。 statusDlg->IsWindowVisible()に電話してください。あなたはstatusDlgポインタのどこかにハングアップしていると仮定しています。

私は、その後、あなたはは以下のように電話をかけたくないなかったようにあなたは、PostNcDestroy()をオーバーライドする場合:代わりに、あなたはこれをしたい

delete statusDlg; // bad things will happen... (attempted double deletion) 

statusDlg->DestroyWindow(); // PostNcDestroy() takes care of deletion 

何I上記はモードレスダイアログにも当てはまります。モーダルダイアログでは、少し異なります。

+0

* "これはダイアログを非表示にしますが、ダイアログ[...]のウィンドウハンドルは有効です。" * - これは正しくありません。 [EndDialog](https://msdn.microsoft.com/en-us/library/windows/desktop/ms645472.aspx)はネイティブダイアログオブジェクトを破壊します( 'HWND'も無効になります)。あなたの回避策もかなり脆弱で、私はそれをお勧めしません。その代わりに、C++クラスを使用してオブジェクトの有効期間を制御する必要があります(不要な場合は、** do ** delete statusDlg;を使用してください)。 – IInspectable

+0

あなたは間違っています。 VS 2013で小さなテストアプリを書いたから(と私はそれが変更されているとは思えない)私は知っている。モードレスMFCダイアログでは、ウィンドウが閉じられた後でもウィンドウハンドルは有効です。ウィンドウはプロセスが終了するまで破棄されません。私はPostNcDestroy()にブレークポイントを設定し、アプリケーションが終了するまで呼び出されないので知っています。 必要に応じて不安定にすることができますが、CViewクラスやCFrameWndクラスではMFCと同じことです。 –

+0

[EndDialog](https://msdn.microsoft.com/en-us/library/windows/desktop/ms645472.aspx)のAPIドキュメントが間違っていますか?それとも、本当にしなかったときに、それが呼ばれたという事実を偽っていましたか? – IInspectable

関連する問題