2009-10-15 44 views
1

我有一個從CDialog類繼承的CStdDlg。在CStdDlg對話框中,我有一個列表框(m_lcList1),編輯框(m_ceEdit1),單選按鈕(m_rbButton2)以及按鈕OK,Cancel和Button1。我似乎無法將列標題添加到繼承的MFC對話框中的列表框中。怎麼了?

我想創建另一個名爲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_) 
=================================================================================== 

回答

1

我猜測,由於DDX_Control()在基類上,派生類不會將資源控件鏈接到它們各自的類。你可能想試圖改變這一點:

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

到這一點:

void CDerivedDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CStdDlg::DoDataExchange(pDX); 
+0

我給了這個嘗試,它並沒有區別。你如何看待尼克的回答在上面顯示? 謝謝, 邁克 – 2009-10-15 18:29:23

+0

我以爲我試過這個,但是當再做一次,程序現在工作!非常感謝你。 – 2009-10-15 19:44:52

+0

@unknown(雅虎),你應該接受這個答案。 – 2009-10-15 19:49:32

0
m_lcList1.InsertColumn(0,"This is a test"); *******THIS IS WHERE IT CRASHES***** 

你必須創建控制,你就可以使用它之前。
參見CListCtrl::Create和/或CListCtrl::CreateEx方法。
您必須選擇LVS_REPORT樣式,因爲您想將該列表用作報表視圖控件。

+0

感謝。爲什麼我必須創建它?如果我只是在沒有CDerivedDlg類的情況下使用CStdDlg,我不應該創建它。我創建了另一個帶有列表框的短mfc應用程序,並將相同類型的代碼放在OnInitDialog函數中,並且它工作正常。我確實將行更改爲m_lcList.InsertColumn(0,「這是一個測試」,LVCFMT_LEFT,200),但只是使標題出現。 再次感謝, Mike – 2009-10-15 18:28:08

+0

如果您在應用程序中包含對話框模板,那麼是的,您不必顯式創建它。如果你刪除有問題的行,你的對話框是否正確執行?你是否將該列表視爲空白窗口? – 2009-10-15 18:46:36

+0

我在應用程序中包含對話框模板。如果我刪除有問題的線路,它工作正常。列表框顯示爲空白窗口,但第一行顯示爲淺棕色。 – 2009-10-15 19:01:01

相關問題