MFCのVisualc ++ 6.0で非モーダルダイアログを作成して表示する方法を教えてもらえますか?私はこのコードを書きました:
CDialog dialog;
if (dialog.init(initialization values...))
dialog.DoModal();
しかし、それは私のアプリケーションがダイアログを表示するのをブロックします。それを行う方法や他の方法があるかどうかはわかりません。
ありがとう
/* CChildDialog class is inherited from CDialog */
CChildDialog *m_pDialog = NULL;
// Invoking the Dialog
m_pDialog = new CChildDialog();
if (m_pDialog != NULL)
{
BOOL ret = m_pDialog->Create(IDD_CHILDDIALOG, this);
if (!ret) //Create failed.
{
AfxMessageBox(_T("Error creating Dialog"));
}
m_pDialog->ShowWindow(SW_SHOW);
}
// Delete the dialog once done
delete m_pDialog;
あなたは呼び出すことができます CDialog::Create
および CWnd::ShowWindow
他の人が提案したように。
また、ダイアログがローカル変数に格納されている場合、ダイアログは作成直後に破棄されるになることに注意してください。
CDialog :: Createを使用してから、CDialog :: ShowWindowを使用します。これで、モードレスダイアログボックスが表示されます。
この場合、クリーンアップを処理するためにそれ自体を自己削除させるのが最も便利だと思います。
多くの場合、クラス内から「暗黙の」メモリを解放することは、それが作成したものではなく、悪い形式と見なされますが、私は通常、モードのないダイアログボックスを例外とします。
あれは;
呼び出しコード:
#include "MyDialog.h"
void CMyApp::OpenDialog()
{
CMyDialog* pDlg = new CMyDialog(this);
if (pDlg->Create(IDD_MYDIALOG, this))
pDlg->ShowWindow(SW_SHOWNORMAL);
else
delete pDlg;
}
ダイアログコード:
void CMapBasicDlg::OnDestroy()
{
CDialog::OnDestroy();
delete this; // Shown as non-modal, we'll clean up ourselves
}
代わりにCDialog::Create
を呼び出す必要があります。ダイアログが終了したら、DestroyWindow
を呼び出す必要があります。ダイアログメッセージをオブジェクトに渡す必要があるかもしれませんが、MFCがこれを処理するかどうかは思い出せません。
DoModalがブロックしています。ヒープ上にダイアログを作成するか、クラスのメンバーにする必要があります(これは重要です)。Createを呼び出してからShowWindowを呼び出します。