none
MFCでモードレスダイアログボックスが表示できません RRS feed

  • 質問

  • H26年1月28日

    MFCでモードレスダイアログボックスが表示できません

    メインのウィンドウとともに、ダイアログボックスを常時表示しておき、ダイアログボックスで設定した情報が、メインのウィンドウに反映されるようにしたいのですが、うまくいきません。

    こういう風に使用するダイアログボックスを、「モードレスダイアログボックス」というようですが、下記のWebサイトを参考に作成したのですが、メインのウィンドウは表示されますが、ダイアログボックスが表示されません。

    当方はMFCの初心者です。何でもよいので情報がありましたらご教示いただければ幸いです。よろしくお願いします。

    1.      参考にしたWebサイト

    「モードレスダイアログボックス」

    http://www.vcppclub.com/kouza/memo/modeless.html

    2.      当方で行ったこと

    2.1 新規プロジェクトの作成

    テンプレートはMFCアプリケーション、プロジェクト名「Diatest2」、シングルドキュメント形式で作成しました。

    2.2 ダイアログリソースの作成

    (1)「プロジェクト」→「リソースの追加」→「Dialog」→「新規作成」でダイアログボックスを作成し、IDは「IDD_DLG1」としました。ダイアログボックスにエディットボックスを1個追加しました。

    (2)1項のWebサイトには「ダイアログの[プロパティ]で、 [その他のスタイル]中の [可視]をチェックします。」とありますが、プロパティの「その他のスタイル」といった項目が英語の項目のどれに当たるかわからなかったので、この設定はしませんでした。(これが原因でしょうか?)

    (3)クラスウィザードでダイアログのクラスを作成し、クラス名は「CDlg1」としました。

    2.3 メンバ変数の追加

    CDlg1クラスにWebサイトで指定されたようにメンバ変数2個(m_nParentm_nID)を追加しました。

    2.4 コンストラクタに2行追加

    CDlg1クラスのコンストラクタにWebサイトで指定されたコードを2行追加しました。

    2.5 Create()関数の追加

    CDlg1のクラスウィザードで「仮想関数」の「Create」を追加し、Webサイトで指定されたように引数を削除し、コードを変更しました。

    2.6 グローバル変数CDlg1* pDlg = new CDlg1;を追加し、メインウィンドウのCDiatest2ViewOnInitialUpdateからpDlg1->Create();を実行するようにしました。

    3.      プログラムリスト

    3.1 Dlg1.h

    #pragma once

    // CDlg1 ダイアログ

    class CDlg1 : public CDialogEx

    {

        DECLARE_DYNAMIC(CDlg1)

    public:

        CDlg1(CWnd* pParent = NULL);   // 標準コンストラクター

        virtual ~CDlg1();

    // ダイアログ データ

        enum { IDD = IDD_DLG1 };

    protected:

        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート

        DECLARE_MESSAGE_MAP()

    public:

        // モードレスダイアログ用

        CWnd* m_pParent;

        // モードレスダイアログ用

        int m_nID;

        virtual BOOL Create(/*LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL*/);

    };

    3.2 Dlg1.cpp

    // Dlg1.cpp : 実装ファイル

    //

    #include "stdafx.h"

    #include "Diatest2.h"

    #include "Dlg1.h"

    #include "afxdialogex.h"

    //グローバル変数追加 モードレスダイアログ用

    CDlg1* pDlg1 = new CDlg1;

    // CDlg1 ダイアログ

    IMPLEMENT_DYNAMIC(CDlg1, CDialogEx)

    CDlg1::CDlg1(CWnd* pParent /*=NULL*/)

        : CDialogEx(CDlg1::IDD, pParent)

        , m_pParent(NULL)

        , m_nID(0)

    {

        //--------------------------ここから追加

        m_pParent = pParent;

        m_nID = CDlg1::IDD;

        //--------------------------ここまで追加

    }

    CDlg1::~CDlg1()

    {

    }

    void CDlg1::DoDataExchange(CDataExchange* pDX)

    {

        CDialogEx::DoDataExchange(pDX);

    }

    BEGIN_MESSAGE_MAP(CDlg1, CDialogEx)

    END_MESSAGE_MAP()

    // CDlg1 メッセージ ハンドラー

    BOOL CDlg1::Create(/*LPCTSTR lpszTemplateName, CWnd* pParentWnd*/)

    {

        // TODO: ここに特定なコードを追加するか、もしくは基底クラスを呼び出してください。

        //return CDialogEx::Create(lpszTemplateName, pParentWnd);

        return CDialog::Create(m_nID, m_pParent);

    }

    3.3 Diatest2View.cpp

    // Diatest2View.cpp : CDiatest2View クラスの実装

    //

    #include "stdafx.h"

    // SHARED_HANDLERS は、プレビュー、縮小版、および検索フィルター ハンドラーを実装している ATL プロジェクトで定義でき、

    // そのプロジェクトとのドキュメント コードの共有を可能にします。

    #ifndef SHARED_HANDLERS

    #include "Diatest2.h"

    #endif

    #include "Diatest2Doc.h"

    #include "Diatest2View.h"

    #ifdef _DEBUG

    #define new DEBUG_NEW

    #endif

    #include "Dlg1.h"           // 追加 モードレスダイアログ用

    extern CDlg1* pDlg1;        //追加 モードレスダイアログ用

    // CDiatest2View

    IMPLEMENT_DYNCREATE(CDiatest2View, CView)

    (途中省略)

    // CDiatest2View メッセージ ハンドラー

    void CDiatest2View::OnInitialUpdate()

    {

        CView::OnInitialUpdate();

        // TODO: ここに特定なコードを追加するか、もしくは基底クラスを呼び出してください。

        pDlg1->Create();        //追加 モードレスダイアログ用

    }

    以上のようにプログラムしましたが、ダイアログボックスが表示されません。

    4.      開発環境

    Windows 8.1Visual Studio 2013 Pro.です。

    以上、よろしくお願いします。

    2014年1月28日 8:40

回答

  • fghck854さん

    こんにちは。

    pDlg1->Create()のあとに、pDlg->ShowWindow(SW_SHOW);をいれてください。

    モードレスダイアログは、ShowWindowをしないと表示されません。

    DoModal()とは違いますので、ご注意下さいませ。

    • 回答としてマーク fghck854 2014年1月28日 10:37
    2014年1月28日 9:55

すべての返信

  • fghck854さん

    こんにちは。

    pDlg1->Create()のあとに、pDlg->ShowWindow(SW_SHOW);をいれてください。

    モードレスダイアログは、ShowWindowをしないと表示されません。

    DoModal()とは違いますので、ご注意下さいませ。

    • 回答としてマーク fghck854 2014年1月28日 10:37
    2014年1月28日 9:55
  • にゃにゃお 様

    おっしゃるコードを入れて、無事ダイアログが表示されました。迅速かつ適切なアドバイスありがとうございました。

    2014年1月28日 10:37