Mfc visualc&x2B+;6.0-派生CDialog类中的OnInitDialog不工作
我已经创建了一个简单的MFC appwizard对话框项目。我使用类向导基于CDialog创建了一个名为CMyDlg的新类。然后我转到消息映射屏幕,双击WM_INITDIALOG条目,自动创建一个CMyDlg::OnInitDialog()处理程序 我遇到的问题是CMyDlg::OnInitDialog()不会调用。我在那里放了一个断点,它根本不会调用。父对话框的OnInitDialog()方法被调用,但它不会调用CMyDlg::OnInitDialog()方法 有什么特别的事情需要做吗 我已经设法实现了一种变通方法,即从父对话框的OnInitDialog()方法发送我自己的消息,并在CMyDlg中处理它,但是。。我肯定这不是做这件事的方法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()方法 有什么特别的事情需要做吗 我已经
// 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函数