web-dev-qa-db-ja.com

非モーダルCDialogを表示する方法は?

MFCのVisualc ++ 6.0で非モーダルダイアログを作成して表示する方法を教えてもらえますか?私はこのコードを書きました:

CDialog dialog;
if (dialog.init(initialization values...))
   dialog.DoModal();

しかし、それは私のアプリケーションがダイアログを表示するのをブロックします。それを行う方法や他の方法があるかどうかはわかりません。

ありがとう

14
/* 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;
17
Ramakrishna

あなたは呼び出すことができます CDialog::Create および CWnd::ShowWindow 他の人が提案したように。

また、ダイアログがローカル変数に格納されている場合、ダイアログは作成直後に破棄されるになることに注意してください。

4
phil

CDialog :: Createを使用してから、CDialog :: ShowWindowを使用します。これで、モードレスダイアログボックスが表示されます。

4
Goz

この場合、クリーンアップを処理するためにそれ自体を自己削除させるのが最も便利だと思います。

多くの場合、クラス内から「暗黙の」メモリを解放することは、それが作成したものではなく、悪い形式と見なされますが、私は通常、モードのないダイアログボックスを例外とします。

あれは;

呼び出しコード:

#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
}
3
Jonas

代わりにCDialog::Createを呼び出す必要があります。ダイアログが終了したら、DestroyWindowを呼び出す必要があります。ダイアログメッセージをオブジェクトに渡す必要があるかもしれませんが、MFCがこれを処理するかどうかは思い出せません。

2
Rob

DoModalがブロックしています。ヒープ上にダイアログを作成するか、クラスのメンバーにする必要があります(これは重要です)。Createを呼び出してからShowWindowを呼び出します。

2