Visual C++ 6.0 - OnInitDialog in einer Abgeleiteten CDialog-Klasse funktioniert nicht
Habe ich erstellen Sie eine einfache MFC-Anwendungs-Assistent-Dialogfeld Projekt. Ich benutzte Sie den Klassen-Assistenten zum erstellen einer neuen Klasse namens CMyDlg basierend auf CDialog. Dann ging ich zu der Message, screen-und doubleclicked auf die WM_INITDIALOG-Eintrag automatisch erstellen CMyDlg::OnInitDialog () - handler.
Das problem, das ich habe, ist, dass CMyDlg::OnInitDialog() nicht nennen werde. Ich habe einen Haltepunkt in es und will es einfach nicht nennen. Das übergeordnete Dialogfeld OnInitDialog () - Methode aufgerufen wird, aber es wird nicht rufen Sie die CMyDlg::OnInitDialog () - Methode.
Ist es etwas besonderes als muss getan werden?
Ich habe es geschafft, eine Problemumgehung implementieren, die eine Nachricht zu senden, von meinem eigenen aus den übergeordneten dialog OnInitDialog () - Methode und haben es behandelt in CMyDlg aber.. ich bin mir sicher, dies ist nicht der Weg, es zu tun..
//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_)
Danke Jungs. Ich habe hochgeladen, die dummy-Projektes auf den link unten. Versuchen Sie das Projekt zu erstellen und Sie werden feststellen, dass CMyDlg::OnInitDialog() wird nie aufgerufen.
Entfernte ich die IDD enum und Konstruktor wie hingewiesen, oben, aber es machte keinen Unterschied überhaupt. Es ist nicht CMyDlg dlg; dlg.DoModal () - Aufruf als Haupt-dialog selbst es abgeleitet von CMyDlg im Gegensatz zu den üblichen CDialog-Klasse.
Habe ich noch nicht, hat dieses Problem gelöst, so dass jede Hilfe wäre sehr geschätzt.
Cheers
- Wie werden Sie versuchen, um Ihre CMyDlg Instanz?
- Hallo Meilen. Ich begann mit einem einfachen dialog-app (eine, die der Assistent für Sie tut und zeigt ein statisches label, einem OK-und Abbrechen-button). Ich habe dann geändert, so dass statt, wenn die Unterklassen der CDialog-Klasse, es Unterklassen CMyDlg statt. Cheers
- Vermutlich haben Sie einige code, der aussieht wie CMyDlg myDlg; myDlg.DoModal();? Können wir sehen, dass der code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leiten Sie
CDeriveDlgTestDlg
ausCMyDlg
aber im innerenCDeriveDlgTestDlg::OnInitDialog()
Sie ausdrücklich die direkte compiler, um zu springen über die base-Klasse und führenCDialog::OnInitDialog()
, soCMyDlg::OnInitDialog()
wird nie aufgerufen.Müssen Sie nicht mit der WM_INITDIALOG-Nachricht wenn Sie eine MFC-Dialogfeld.
Der MFC CDialog-Klasse eine virtuelle Methode mit dem Namen OnInitDialog() das müssen Sie einfach überschreiben und die wird aufgerufen.
Können Sie erstellen, die Methode, die automatisch von der "überschreibt" tab statt dem "Fenster " Nachrichten" - tab in VS.
Windows calls the OnInitDialog function via the standard global dialog-box procedure common to all Microsoft Foundation Class Library dialog boxes, rather than through your message map, so you do not need a message-map entry for this member function
Also keine message-Karte benötigt wird.Wenn Sie eine Version bauen, anstatt zu Debuggen, müssen Sie möglicherweise Probleme bei der Einstellung Haltepunkte - Sie könnten get set auf die falsche Linie oder völlig ignoriert. Entweder doppelklicken Sie überprüfen, um zu sehen, dass Sie verwenden ein Debug-build, oder einen anderen Weg finden, um festzustellen, ob der code notwendig ist oder nicht, nicht erreicht. Ich sehe nichts offensichtlich falsch mit Ihrem code.
Wenn Sie verwenden möchten CMyDlg als Basis für weitere dialog-Klassen, können Sie nicht die IDD-set in der CMyDlg-Klasse. Die IDD-sollte festgelegt werden, auf die Klasse abgeleitet CMyDlg.
So löschen Sie diese:
und ersetzen Sie die standard-Konstruktor:
Edit: ich sah gerade deinen link-code. Haben Sie bemerkt, daß dieser in der abgeleiteten Klasse?
Wird, die Sie anrufen
CDialog::OnInitDialog()
, nichtCMyDlg::OnInitDialog()
!In der Tat, sollten Sie ersetzen Sie alle Erwähnungen von
CDialog
thar erscheinen inCDeriveDlgTestDlg
mitCMyDlg
. Tun Sie dies, und du bist gut zu gehen.