1

我有一个继承自 CDialog 类的 CStdDlg。在 CStdDlg 对话框中,我有一个列表框 (m_lcList1)、编辑框 (m_ceEdit1)、一个单选按钮 (m_rbButton2) 和按钮 OK、Cancel 和 Button1。

我正在尝试创建另一个名为 CDerivedDlg 的类,它继承自 CStdDlg。我想使用 CStdDlg 中的所有内容,但来自 CDerivedDlg。这是一个愚蠢的测试应用程序,但我需要的东西就像这是一个真正的应用程序。

我将在下面显示所有代码。问题:每当我尝试将列标题添加到列表框中时,问题就会不断出现。m_hWnd = NULL

谁能告诉我怎么了?我真的很感激。谢谢你。

// CStdDlg.cpp file

#include "stdafx.h"  
#include "testdlg.h"
#include "StdDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CStdDlg dialog
CStdDlg::CStdDlg(UINT nIDTemplate, CWnd* pParent /*=NULL*/)
    : CDialog(CStdDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CStdDlg)
    //}}AFX_DATA_INIT
}
void CStdDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CStdDlg)
    DDX_Control(pDX, IDC_EDIT1, m_ceEdit1);
    DDX_Control(pDX, IDC_RADIO2, m_rbButton2);
    DDX_Control(pDX, IDC_LIST1, m_lcList1);
    //}}AFX_DATA_MAP
}
IMPLEMENT_DYNAMIC(CStdDlg, CDialog)
BEGIN_MESSAGE_MAP(CStdDlg, CDialog)
    //{{AFX_MSG_MAP(CStdDlg)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CStdDlg message handlers
BOOL CStdDlg::OnInitDialog() 
{
    CDialog::OnInitDialog();

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}
===================================================================================

//CStdDlg.h file

#if !defined(AFX_STDDLG_H__CDAFF61F_91AB_4B47_9970_6B8BB5DE0003__INCLUDED_)
#define AFX_STDDLG_H__CDAFF61F_91AB_4B47_9970_6B8BB5DE0003__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// StdDlg.h : header file
//
#include <afxwin.h>

/////////////////////////////////////////////////////////////////////////////
// CStdDlg dialog

class CStdDlg : public CDialog
{
    DECLARE_DYNAMIC(CStdDlg)
// Construction
public:

    CStdDlg(UINT nIDTemplate,CWnd* pParent = NULL);   // standard constructor
    CString GetTitle() { 
        CString csTTL;
        GetWindowText(csTTL);
        return csTTL;
    }
// Dialog Data
    //{{AFX_DATA(CStdDlg)
    enum { IDD = IDD_STDDLG };
    CEdit   m_ceEdit1;
    CButton m_rbButton2;
    CListCtrl   m_lcList1;
    //}}AFX_DATA


// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CStdDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:
    void ShowMsg() { AfxMessageBox("ShowMsg from StdDlg"); }
    // Generated message map functions
    //{{AFX_MSG(CStdDlg)
    virtual BOOL OnInitDialog();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDDLG_H__CDAFF61F_91AB_4B47_9970_6B8BB5DE0003__INCLUDED_)

===================================================================================
//CDerivedDlg.cpp file

// StdDlg.cpp : implementation file
//

#include "stdafx.h"
#include "testdlg.h"
#include "CDerivedDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDerivedDlg dialog


CDerivedDlg::CDerivedDlg(CWnd* pParent /*=NULL*/)
    : CStdDlg(CDerivedDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CDerivedDlg)
    //}}AFX_DATA_INIT
}


void CDerivedDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CDerivedDlg)
    //}}AFX_DATA_MAP
}


IMPLEMENT_DYNAMIC(CDerivedDlg, CStdDlg)
BEGIN_MESSAGE_MAP(CDerivedDlg, CStdDlg)
    //{{AFX_MSG_MAP(CDerivedDlg)
    ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDerivedDlg message handlers


//void CDerivedDlg::OnOK() 
//{
//  // TODO: Add extra validation here
//  AfxMessageBox("CDerived Class OK button pressed");
//  CDialog::OnOK();
//}

BOOL CDerivedDlg::OnInitDialog() 
{
    CStdDlg::OnInitDialog();
    SetWindowText("Derived Test Window");
    m_lcList1.InsertColumn(0,"This is a test");    *******THIS IS WHERE IT CRASHES*****


    m_rbButton2.ShowWindow(SW_HIDE);
    m_ceEdit1.ShowWindow(SW_HIDE);



    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}


void CDerivedDlg::OnButton1() 
{
//  // TODO: Add extra validation here
    AfxMessageBox("CDerived Button1 pressed");
    AfxMessageBox(GetTitle());

}

void CDerivedDlg::OnOK() 
{
    AfxMessageBox("CDerived Class OK button pressed");

}
===================================================================================
// CDerivedDlg.h file

#if !defined(AFX_CDerivedDlg_H__CDAFF61F_91AB_4B47_9970_6B8BB5DE0003__INCLUDED_)
#define AFX_CDerivedDlg_H__CDAFF61F_91AB_4B47_9970_6B8BB5DE0003__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// CDerivedDlg.h : header file
//
#include "StdDlg.h"

/////////////////////////////////////////////////////////////////////////////
// CDerivedDlg dialog

class CDerivedDlg : public CStdDlg
{
    DECLARE_DYNAMIC(CDerivedDlg)
// Construction
public:
    CDerivedDlg(CWnd* pParent = NULL);   // standard constructor
    virtual void SetTTL(CString csTitle) { this->SetWindowText(csTitle); }

// Dialog Data
    //{{AFX_DATA(CDerivedDlg)
    enum { IDD = IDD_STDDLG };
    //}}AFX_DATA


// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CDerivedDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:

    // Generated message map functions
    //{{AFX_MSG(CDerivedDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnButton1();
    virtual void OnOK();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_CDerivedDlg_H__CDAFF61F_91AB_4B47_9970_6B8BB5DE0003__INCLUDED_)
===================================================================================
4

2 回答 2

1

我猜由于 DDX_Control() 在基类上,派生类不会将资源控件链接到它们各自的类。您可能想尝试更改此设置:

void CDerivedDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);

进入这个:

void CDerivedDlg::DoDataExchange(CDataExchange* pDX)
{
    CStdDlg::DoDataExchange(pDX);
于 2009-10-15T18:20:18.977 回答
0
m_lcList1.InsertColumn(0,"This is a test");    *******THIS IS WHERE IT CRASHES*****

您必须先创建控件,然后才能使用它。
请参阅CListCtrl::Create和/或CListCtrl::CreateEx方法。由于要将列表用作报表视图控件,
因此必须选择样式。LVS_REPORT

于 2009-10-15T18:19:40.303 回答