Mfc visualc&x2B+;6.0-派生CDialog类中的OnInitDialog不工作

Mfc visualc&x2B+;6.0-派生CDialog类中的OnInitDialog不工作,mfc,derived,cdialog,Mfc,Derived,Cdialog,我已经创建了一个简单的MFC appwizard对话框项目。我使用类向导基于CDialog创建了一个名为CMyDlg的新类。然后我转到消息映射屏幕,双击WM_INITDIALOG条目,自动创建一个CMyDlg::OnInitDialog()处理程序 我遇到的问题是CMyDlg::OnInitDialog()不会调用。我在那里放了一个断点,它根本不会调用。父对话框的OnInitDialog()方法被调用,但它不会调用CMyDlg::OnInitDialog()方法 有什么特别的事情需要做吗 我已经

我已经创建了一个简单的MFC appwizard对话框项目。我使用类向导基于CDialog创建了一个名为CMyDlg的新类。然后我转到消息映射屏幕,双击WM_INITDIALOG条目,自动创建一个CMyDlg::OnInitDialog()处理程序

我遇到的问题是CMyDlg::OnInitDialog()不会调用。我在那里放了一个断点,它根本不会调用。父对话框的OnInitDialog()方法被调用,但它不会调用CMyDlg::OnInitDialog()方法

有什么特别的事情需要做吗

我已经设法实现了一种变通方法,即从父对话框的OnInitDialog()方法发送我自己的消息,并在CMyDlg中处理它,但是。。我肯定这不是做这件事的方法

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

谢谢各位。我已经将虚拟项目上传到下面的链接。尝试构建项目,您会发现从未调用过CMyDlg::OnInitDialog()

我按照上面的建议删除了IDD枚举和构造函数,但这一点都没有影响。没有CMyDlg dlg;dlg.DoModal()调用作为主对话框本身,它是从CMyDlg派生的,而不是通常的CDialog类

我还没有解决这个问题,所以任何帮助都将不胜感激

干杯


如果要将CMyDlg用作其他对话框类的基础,则不能在CMyDlg类中设置IDD。IDD应该在从CMyDlg派生的类上设置

因此,您应该删除以下内容:

enum { IDD = IDD_DERIVEDLGTEST_DIALOG };
并替换标准构造函数:

// 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)
{
}
编辑:我刚看到你的链接代码。您在派生类中注意到了这一点吗

BOOL CDeriveDlgTestDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
您正在调用的是
CDialog::OnInitDialog()
,而不是
CMyDlg::OnInitDialog()


事实上,您应该将
CDialog
中出现的
CDeriveDlgTestDlg
中提到的所有内容替换为
CMyDlg
。这样做,您就可以开始了。

如果您想使用CMyDlg作为其他对话框类的基础,您不能在CMyDlg类中设置IDD。IDD应该在从CMyDlg派生的类上设置

因此,您应该删除以下内容:

enum { IDD = IDD_DERIVEDLGTEST_DIALOG };
并替换标准构造函数:

// 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)
{
}
编辑:我刚看到你的链接代码。您在派生类中注意到了这一点吗

BOOL CDeriveDlgTestDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
您正在调用的是
CDialog::OnInitDialog()
,而不是
CMyDlg::OnInitDialog()


事实上,您应该将
CDialog
中出现的
CDeriveDlgTestDlg
中提到的所有内容替换为
CMyDlg
。这样做,您就可以开始了。

如果您使用的是MFC对话框,则不能处理WM_INITDIALOG消息。 MFC CDialog类有一个名为OnInitDialog()的虚拟方法,您必须简单地重写该方法,然后调用该方法。
您可以从VS中的“覆盖”选项卡而不是“窗口消息”选项卡自动创建该方法。

如果使用MFC对话框,则不得处理WM_INITDIALOG消息。 MFC CDialog类有一个名为OnInitDialog()的虚拟方法,您必须简单地重写该方法,然后调用该方法。
您可以从VS中的“覆盖”选项卡而不是“窗口消息”选项卡自动创建该方法。

如果您使用的是发布版本而不是调试,则设置断点可能会有问题-断点可能设置在错误的行上,或者完全被忽略。请仔细检查您是否正在使用调试版本,或者找到另一种方法来确定是否正在访问代码。我看不出您的代码有任何明显的错误。

如果您使用的是发行版而不是调试版,那么设置断点可能会有问题-断点可能设置在错误的行上,或者被完全忽略。请仔细检查您是否正在使用调试版本,或者找到另一种方法来确定是否正在访问代码。我看不出您的代码有任何明显的错误。

您认为
CDeriveDlgTestDlg
来自
CMyDlg
但在
CDeriveDlgTestDlg::OnInitDialog()
内部,您显式地指示编译器跳过基类并执行
CDialog::OnInitDialog()
,因此永远不会调用
CMyDlg::OnInitDialog()

您派生
CDeriveDlgTestDlg
来自
CMyDlg
但在
CDeriveDlgTestDlg::OnInitDialog()
内部,您显式地指示编译器跳过基类并执行
CDialog::OnInitDialog()
,因此永远不会调用
CMyDlg::OnInitDialog()

您如何尝试显示您的CMyDlg实例?您好。我从一个简单的对话框应用程序开始(向导会为你做这个程序,并显示一个静态标签、一个OK和Cancel按钮)。然后我对其进行了修改,使其不再子类化CDialog类,而是子类化CMyDlg。干杯很可能你有一些代码看起来像CMyDlg myDlg;myDlg.DoModal();?我们能看到代码吗?你是如何显示你的CMyDlg实例的?嗨,迈尔斯。我从一个简单的对话框应用程序开始(向导会为你做这个程序,并显示一个静态标签、一个OK和Cancel按钮)。然后我对其进行了修改,使其不再子类化CDialog类,而是子类化CMyDlg。干杯很可能你有一些代码看起来像CMyDlg myDlg;myDlg.DoModal();?我们能看到那个代码吗?消息映射是空的,所以这似乎不是问题所在。我不知道它是否会伤害任何东西,即使它在那里。<代码> Windows通过标准的全局对话框对话框程序调用OnInItTalk函数,这是所有微软基础类库对话框中常见的,而不是通过您的消息映射。因此,此成员函数不需要消息映射条目,因此不需要消息映射。消息映射为空,因此这似乎不是问题。我不确定它是否会伤害任何东西,即使它在那里。
Windows通过所有人通用的标准全局对话框过程调用OnInitDialog函数