代码之家  ›  专栏  ›  技术社区  ›  SparkyNZ

VisualC++ 6 - OnInItListin派生的cCalk类不工作

  •  1
  • SparkyNZ  · 技术社区  · 16 年前

    我遇到的问题是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_)
    

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

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

    干杯

    link text

    4 回复  |  直到 14 年前
        1
  •  4
  •   BostonLogan    16 年前

    你得到 CDeriveDlgTestDlg 从…起 CMyDlg CDeriveDlgTestDlg::OnInitDialog() CDialog::OnInitDialog() 所以 CMyDlg::OnInitDialog() 从来没有人打过电话。

        2
  •  0
  •   Stefan    16 年前

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

        3
  •  0
  •   Mark Ransom    16 年前

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

        4
  •  0
  •   djeidot    16 年前

    如果要将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 . 这样做,你就可以走了。

    推荐文章