由于有一些共同的控件及相应的操作,我想把其作为其类,其它子类直接用该基类中的控件及方法,
在delphi中很好实现的问题,在VC中不知如何实现,我已经做了如下工作:
从CDialog中定义了一个对话框,具体定义如下:
class : public CDialog
{
// Construction
public:
BaseDlg(UINT id = NULL,CWnd* pParent = NULL);   // standard constructor// Dialog Data
//{{AFX_DATA(BaseDlg)
CProgressCtrl m_Progress;
CComboBox m_SecondIL;
CComboBox m_FirstIL;
BOOL m_bSupport;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(BaseDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
//}}AFX_VIRTUAL// Implementation
public:
void SetBtuHardType(int nHardType);
private:
CString GetILFile(int nPos);
void SetSecondPos(int nPos);
CString m_strFirstILFile;
CString m_strSecondILFile;
int m_nHardType;
protected: // Generated message map functions
//{{AFX_MSG(BaseDlg)
virtual BOOL OnInitDialog();
afx_msg void OnCloseupCbFirstIL();
afx_msg void OnCloseupCbSecondIL();
afx_msg void OnSupportAnother();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};把类中的enum { IDD = IDD_DIALOGBASE };语句去掉了。我定义了两个子对话框,先是从CDialog中继承,生成了相应的新类后,我在头文件和CPP文件中把所有的CDialog改成了CBaseDlg编译连接通过。在一个按钮中调用如下代码:
CCalibrateDlg CalibrateDlg;
CalibrateDlg.DoModal();运行后出现如下异常:
异常内容如下:
Debug Assertion Failed!
File:dlgdata.cpp
line:43开始以为要创建,用下面的方法
CCalibrateDlg *pCalibrateDlg = new CCalibrateDlg(this);
pCalibrateDlg->DoModal();
出现相同的异常,不知这是为什么,请高手指点!!!!

解决方案 »

  1.   

    把类中的enum { IDD = IDD_DIALOGBASE };语句去掉了。
    这里通过枚举,和资源关联,那你这个对话框类和哪个对话框资源关联???
      

  2.   

    class : public CDialog///????怎么没有类名
      

  3.   

    CCalibrateDlg 是子类,定义如下,刚才忘贴上来
    class CCalibrateDlg : public BaseDlg
    {
    // Construction
    public:
    CCalibrateDlg(CWnd* pParent = NULL);   // standard constructor// Dialog Data
    //{{AFX_DATA(CCalibrateDlg)
    enum { IDD = IDD_DIALOGCALIBRATE };
    // NOTE: the ClassWizard will add data members here
    //}}AFX_DATA
    // Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CCalibrateDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL// Implementation
    protected: // Generated message map functions
    //{{AFX_MSG(CCalibrateDlg)
    // NOTE: the ClassWizard will add member functions here
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };
      

  4.   

    BaseDlg(UINT id = NULL,CWnd* pParent = NULL);   // standard constructor
    ????class CBaseDlg: public CDialog
    {
    DECLARE_DYNAMIC(CBaseDlg)public:
    CDatabaseDialog(UINT nID,CWnd* pParent = NULL);   // 标准构造函数
    ...IMPLEMENT_DYNAMIC(CBaseDlg, CDialog)
    CBaseDlg::CBaseDlg(UINT nID,CWnd* pParent /*=NULL*/)
    : CDialog(nID, pParent)
    {
    }
      

  5.   

    CCalibrateDlg::CCalibrateDlg(CWnd* pParent = NULL);   // standard constructor
    :CBaseDlg(IDD,pParent)
    {
    }这样即可。
      

  6.   

    基类的类名为BaseDlg
    子类的实现代码如下:
    CCalibrateDlg::CCalibrateDlg(CWnd* pParent /*=NULL*/)
    : BaseDlg(CCalibrateDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CCalibrateDlg)
    // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
    }
    void CCalibrateDlg::DoDataExchange(CDataExchange* pDX)
    {
    BaseDlg::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CCalibrateDlg)
    // NOTE: the ClassWizard will add DDX and DDV calls here
    //}}AFX_DATA_MAP
    }
    BEGIN_MESSAGE_MAP(CCalibrateDlg, BaseDlg)
    //{{AFX_MSG_MAP(CCalibrateDlg)
    // NOTE: the ClassWizard will add message map macros here
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    等待中.....
      

  7.   

    问题已经解决:
    基类中不要把enum { IDD = IDD_BASEDLG };语句去掉
    子类中把CDialog全部改为基类
    同时子类的构造函数把 子类名::IDD去掉即可,
    谢谢大家的帮助。