3

ダイアログボックス(cMyDialog)を作成しました。cMyDialogを複製して、cMyDialog2と呼ぶ予定です。MFCで継承を行うにはどうすればよいですか?cMyDialog2にcMyDialog1からすべてのIDDを継承させて、cMyDialog1からcMyDialog2にコードをコピーして貼り付ける必要がないようにします。cMyDialog2の目的は、cMyDialog1からすべての関数を継承し、それにいくつかの関数を追加することです。


ご返事ありがとうございます。IMPLEMENT_DYNAMICについてはよくわかりません。以下は私のコードの短いスニペットです。マクロを誤解した場合は、確認して手伝ってもらえますか?

// cMyDialog1.cpp : implementation file

cMyDialog1::cMyDialog1(void * pMsgData, CWnd* pParent /*=NULL*/): CDialog(cMyDialog1::IDD, pParent)

{ //codes....
}

BOOL cMyDialog1::OnInitDialog() 

{
    CDialog::OnInitDialog();
...
}


//cMyDialog2.cpp

cMyDialog2::cMyDialog2(void * pMsgData, CWnd* pParent /*=NULL*/)
    : CMyDialog1(cMyDialog2::IDD, pParent)

{ //codes....
   IMPLEMENT_DYNAMIC(cMyDialog2, cMyDialog1)
}

DECLARE_DYNAMICandメソッドを介してCMyDialogから継承できIMPLEMENT_DYNAMICます。アダム、あなたの助けに感謝します。

しかし、質問の2番目の部分を機能させることができませんでした。[名前を付けて保存]ボタンを追加するなど、子ダイアログボックスCMyDialog1にいくつかの機能を追加したかったのですが、追加できませんでした。CMyDialog1はCMyDialogから継承されたダイアログであるため、新しい関数を追加できないためですか?継承されたダイアログボックスに新しい関数を追加するにはどうすればよいですか?

4

2 に答える 2

6

はい、CDialog 派生クラスから継承できます。MFC を満たすには、DECLARE_DYNAMIC などのマクロをいくつか追加するだけで済みます。ここに例があります。これを出発点として使用できます。

.h ファイル内:

class cMyDialog2
  : public cMyDialog
{
  DECLARE_DYNAMIC(cMyDialog2)

pulic:
  cMyDialog2();
  virtual ~cMyDialog2();

protected:
  DECLARE_MESSAGE_MAP()
};

.cpp ファイル内:

#include "cMyDialog2.h"

IMPLEMENT_DYNAMIC(cMyDialog2, cMyDialog)

BEGIN_MESSAGE_MAP(cMyDialog2, cMyDialog)
END_MESSAGE_MAP()

cMyDialog2::cMyDialog2()
{
}

...etc.
于 2009-02-18T00:34:01.907 に答える
0

これは、Adam Pieceの回答への補遺と見なされる可能性があります。DoDataExchange()別のダイアログから派生する場合の の役割を理解することも重要です。派生クラス (cMyDialog2) はこの関数を実装しないか、実装されている (推奨) 場合は、以下のようにベース バージョンを呼び出す必要があります。

void cMyDialog2::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    cMyDialog::DoDataExchange(pDX);
}

これが正しく行われないと、ダイアログのコントロールが作成されず、その結果、呼び出し/実行時にダイアログがクラッシュする可能性があります。

于 2013-09-05T05:10:20.867 に答える