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

質問
-
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_nParent、m_nID)を追加しました。
2.4 コンストラクタに2行追加
CDlg1クラスのコンストラクタにWebサイトで指定されたコードを2行追加しました。
2.5 Create()関数の追加
CDlg1のクラスウィザードで「仮想関数」の「Create」を追加し、Webサイトで指定されたように引数を削除し、コードを変更しました。
2.6 グローバル変数CDlg1* pDlg = new CDlg1;を追加し、メインウィンドウのCDiatest2ViewのOnInitialUpdateから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.1、Visual Studio 2013 Pro.です。
以上、よろしくお願いします。