2009-10-15 6 views
1

J'ai un CStdDlg qui hérite d'une classe CDialog. Dans la boîte de dialogue CStdDlg, j'ai une zone de liste (m_lcList1), une zone d'édition (m_ceEdit1), un bouton radio (m_rbButton2) et les boutons OK, Cancel et Button1. J'essaie de créer une autre classe nommée CDerivedDlg qui hérite de CStdDlg. Je veux utiliser tout dans CStdDlg mais à partir de CDerivedDlg. Ceci est une application de test stupide ici, mais j'ai besoin de quelque chose exactement comme ceci est une vraie application.Je n'arrive pas à ajouter un en-tête de colonne à une zone de liste dans une boîte de dialogue MFC héritée. Qu'est-ce qui ne va pas?

Je vais montrer tout le code ci-dessous. PROBLEME: Le problème continue à bombarder chaque fois que j'essaie d'ajouter un en-tête de colonne à la zone de liste. m_hWnd = NULL

Quelqu'un peut-il me dire ce qui ne va pas? J'apprécierais vraiment. Je vous remercie.

// 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_) 
=================================================================================== 

Répondre

1

Je suppose que puisque les DDX_Control() sont sur la classe de base, la classe dérivée ne liera pas les contrôles de ressources à leurs classes respectives. Vous pouvez essayer de changer cela:

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

dans ce:

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

J'ai essayé et ça n'a pas fait de différence. Que pensez-vous de la réponse de Nick ci-dessus? Merci, Mike –

+0

Je pensais avoir essayé, mais quand je recommence, le programme fonctionne maintenant !!! Merci beaucoup. –

+0

@unknown (yahoo), vous devriez accepter cette réponse. –

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

Vous avez à créer le contrôle avant que vous serez en mesure de l'utiliser.
Voir les méthodes CListCtrl::Create et/ou CListCtrl::CreateEx.
Vous devez choisir le style LVS_REPORT puisque vous souhaitez utiliser la liste comme contrôle d'affichage de rapport.

+0

Merci. Pourquoi devrais-je le créer? Si j'utilisais CStdDlg sans la classe CDerivedDlg, je n'aurais pas à le créer. J'ai créé une autre application mfc courte avec une zone de liste et mettre le même type de code dans la fonction OnInitDialog et cela a bien fonctionné. J'ai changé la ligne en m_lcList.InsertColumn (0, "Ceci est un test", LVCFMT_LEFT, 200) mais cela n'a fait qu'apparaître l'en-tête. Merci encore, Mike –

+0

Si vous incluez les modèles de boîte de dialogue dans vos applications, alors oui, vous n'avez pas à le créer explicitement. Si vous supprimez cette ligne problématique, votre boîte de dialogue s'exécute-t-elle correctement? Voyez-vous la liste comme une fenêtre vide? –

+0

J'inclus les modèles de dialogue dans l'application. Si je supprime la ligne problématique, cela fonctionne très bien. La zone de liste est affichée comme une fenêtre vide, sauf que la première ligne est affichée en brun clair. –

Questions connexes