Visual C ++ 6.0 - OnInitDialog dans une classe CDialog dérivé ne fonctionne pas

StackOverflow https://stackoverflow.com/questions/1711464

  •  19-09-2019
  •  | 
  •  

Question

Je créer un simple MFC AppWizard projet de dialogue. J'ai utilisé l'Assistant classe pour créer une nouvelle classe appelée CMyDlg basée sur CDialog. Puis je suis allé à l'écran un message Carte et sur l'entrée double-cliqué WM_INITDIALOG pour créer automatiquement un gestionnaire CMyDlg :: OnInitDialog ().

Le problème est que je CMyDlg :: OnInitDialog () ne sera pas appel. Je mets un point d'arrêt là-bas et ce sera tout simplement pas appeler. La méthode de dialogue parent OnInitDialog () est appelée, mais il ne sera pas appeler la méthode CMyDlg :: OnInitDialog ().

Y at-il quelque chose de spécial que les besoins à faire?

J'ai réussi à mettre en œuvre une solution qui consiste à envoyer un message de ma propre de la méthode OnInitDialog () de la boîte de dialogue parent et l'avoir traité dans CMyDlg mais .. Je suis sûr que ce n'est pas la façon de le faire ..

// MyDlg.cpp : implementation file
//

#include "stdafx.h"
#include "DeriveDlgTest.h"
#include "MyDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog

CMyDlg::CMyDlg( UINT nIDTemplate, CWnd* pParent /*=NULL*/)
    : CDialog(nIDTemplate, pParent)
{
  // PDS: THIS GETS CALLED
}

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CMyDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CMyDlg)
        // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
}


void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CMyDlg)
        // NOTE: the ClassWizard will add DDX and DDV calls here
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    //{{AFX_MSG_MAP(CMyDlg)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers

BOOL CMyDlg::OnInitDialog() 
{
  // PDS: THIS DOES NOT GET CALLED
    CDialog::OnInitDialog();


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


#if !defined(AFX_MYDLG_H__ECC7F6AC_FEB3_419D_AFE2_6B6DE8196D74__INCLUDED_)
#define AFX_MYDLG_H__ECC7F6AC_FEB3_419D_AFE2_6B6DE8196D74__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MyDlg.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog

class CMyDlg : public CDialog
{
// Construction
public:
    CMyDlg(CWnd* pParent = NULL);   // standard constructor
  CMyDlg( UINT nIDTemplate, CWnd* pParent = NULL);   // standard constructor
// Dialog Data
    //{{AFX_DATA(CMyDlg)
    enum { IDD = IDD_DERIVEDLGTEST_DIALOG };
        // NOTE: the ClassWizard will add data members here
    //}}AFX_DATA


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

// Implementation
protected:

    // Generated message map functions
    //{{AFX_MSG(CMyDlg)
    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_MYDLG_H__ECC7F6AC_FEB3_419D_AFE2_6B6DE8196D74__INCLUDED_)

Merci les gars. J'ai téléchargé le projet factice sur le lien ci-dessous. Essayez de construire le projet et vous constaterez que CMyDlg :: OnInitDialog () est jamais appelé.

J'ai enlevé le enum IDD et constructeur comme conseillé ci-dessus, mais il n'a fait aucune différence. Il n'y a pas CMyDlg DLG; dlg.DoModal () appeler comme la boîte de dialogue principal lui-même, il dérive de CMyDlg par opposition à la classe habituelle CDialog.

Je n'ai pas encore résolu ce problème de sorte que toute aide serait appréciée.

Vive

texte du lien

Était-ce utile?

La solution

Vous dérivez CDeriveDlgTestDlg de CMyDlg mais à l'intérieur CDeriveDlgTestDlg::OnInitDialog() vous compilateur explicitement direct à sauter par-dessus la classe de base et d'exécuter CDialog::OnInitDialog(), donc CMyDlg::OnInitDialog() est jamais appelé.

Autres conseils

Vous ne devez pas traiter le message WM_INITDIALOG si vous utilisez une boîte de dialogue MFC. La classe MFC CDialog a une méthode virtuelle nommée OnInitDialog () que vous devez simplement remplacer et que l'on sera appelé. Vous pouvez créer cette méthode automatiquement à partir de l'onglet « overrides » au lieu de l'onglet « messages fenêtre » dans VS.

Si vous utilisez une version Release plutôt que de débogage, vous pourriez avoir des points d'arrêt de réglage de dépannage - ils pourraient se mettre sur la mauvaise ligne ou totalement ignorés. Soit une double vérification pour voir que vous utilisez une version de débogage, ou trouver une autre façon de déterminer que le code est ou non atteint. Je ne vois rien de mal à votre évidemment code.

Si vous souhaitez utiliser CMyDlg comme base pour d'autres classes de dialogue, vous ne pouvez pas avoir l'ensemble de IDD dans votre classe CMyDlg. L'IDD devrait être mis sur la classe dérivée de CMyDlg.

Vous devez supprimer ceci:

enum { IDD = IDD_DERIVEDLGTEST_DIALOG };

et remplacer le constructeur standard:

// in the .h file:
//CMyDlg(CWnd* pParent = NULL);
CMyDlg(LPCSTR szIDTemplate, CWnd* pParent = NULL );


// in the .cpp file:
CMyDlg::CMyDlg(LPCSTR szIDTemplate,CWnd* pParent /*=NULL*/)
    : CDialog(szIDTemplate, pParent)
{
}

Modifier Je viens de voir votre code de lien. Avez-vous remarqué dans votre classe dérivée?

BOOL CDeriveDlgTestDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

Vous appelez CDialog::OnInitDialog(), pas CMyDlg::OnInitDialog()!

En fait, vous devez remplacer toutes les mentions de thar CDialog apparaissent dans CDeriveDlgTestDlg avec CMyDlg. Pour ce faire, et vous êtes bon pour aller.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top