ダイアログクラスを継承したクラスの派生クラス作成について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
pom

ダイアログクラスを継承したクラスの派生クラス作成について

#1

投稿記事 by pom » 5年前

C++初心者で困っております。
お知恵を頂けると大変嬉しいです。

CDialogクラスを継承したダイアログA(IDD_DLGA)を作成しました。
他のクラス(CTest)からDomoelでIDD_DLGAを表示することはできました。

もうひとつ、ダイアログB(IDD_DLGB)を作りました。
ダイアログAの拡張版のような形で使用したく、ダイアログAクラスの変数やコントロールもすべて使用するので、
ダイアログAクラスの派生クラスとしたいです。

CTestからダイアログを表示する際、ダイアログAを表示するかダイアログBを表示するか条件文の結果により変えたいです。
色々、ネット上で調べて以下のようにしたのですが、コンストラクタのところでうまくいきません。


------------------------------------
◆Dlg_A.h

コード:

class CDlg_A : public CDialog
{
	DECLARE_DYNCREATE(CDlg_A)

public:	

	CDlg_A(UINT IDD=0,CWnd* pParent = NULL); 
	virtual ~CDlg_A();
   
    enum { IDD = IDD_DIALOG1 };
}
protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート
	virtual BOOL OnInitDialog();
	DECLARE_MESSAGE_MAP()
	DECLARE_DHTML_EVENT_MAP()
◆Dlg_A.cpp

コード:

CDlg_A::CDlg_A(UINT IDD,CWnd* pParent /*=NULL*/)
	: CDialog(IDD, pParent)
{

}

CDlg_A::~CDlg_A()
{
}
◆Dlg_B.h

コード:

class CDlg_B : public CDlg_A
{
	DECLARE_DYNAMIC(CDlg_B)

public:
	CDlg_B(CWnd* pParent = NULL);   // 標準コンストラクタ
	virtual ~CDlg_B();

// ダイアログ データ
	enum { IDD = IDD_DIALOG2 };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート
	DECLARE_MESSAGE_MAP()
};
◆Dlg_B.cpp

コード:

CDlg_B::CDlg_B(CWnd* pParent /*=NULL*/)
	: CDlg_A(CDlg_B::IDD, pParent)
{
}

CDlg_B::~CDlg_B()
{
}
------------------------------------
これだと、ダイアログAが表示されず落ちてしまいます。(リソースが指定されていないので)
ダイアログBは表示されるのですが・・。
CDlg_Aクラスで以下のようにダイアログAのリソースIDを指定するとダイアログAは表示されますが
ダイアログBが表示されたいときもダイアログAが表示されていまいます。

コード:

CDlg_A::CDlg_A(UINT IDD,CWnd* pParent /*=NULL*/)
	: CDialog(CDlg_A::IDD, pParent)
{

}
CDlg_BはCDlg_Aの派生クラスなので、必ず基底クラスのCDlg_Aのコンストラクタが呼ばれてリソースIDがCDlg_Aに
上書きされてしまうということでしょうか。

そもそも私がやりたいことはクラスの継承では出来ないことでしょうか。
そのこと自体、自信がありませんので、何か少しでもご意見頂けるとうれしいです。
よろしくお願いいたします。

pom

Re: ダイアログクラスを継承したクラスの派生クラス作成について

#2

投稿記事 by pom » 5年前

質問者です。申し訳ありません。上部に記載したリソースIDとソース上のリソースIDが誤っています。
「IDD_DLGA」は無視してください。混乱を招く書き方になってしまい申し訳ありません。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: ダイアログクラスを継承したクラスの派生クラス作成について

#3

投稿記事 by へにっくす » 5年前

pom さんが書きました:そもそも私がやりたいことはクラスの継承では出来ないことでしょうか。
できないというか、そもそもリソースに継承の概念が確か無かった気が。
コンパイル通すだけなら、リソースIDを指定するコンストラクタを作ればいいだけですが、そこが通っても、思わぬところでおかしい動作をすると思います。

とりあえず参考になるトピック。
CDialogを継承したMy1Dialogを継承したMy2Dialogを作成する方法

私なら一つのダイアログで実現します。
共通の部分は常に表示、それ以外の場合はAかBで表示・非表示を切り替えればいいだけだからです。
(派生する部分はプロパティページなどの子ウィンドウにまとめるとかね)
written by へにっくす

閉鎖

“C言語何でも質問掲示板” へ戻る