主对话框为dialogchange,两个子对话框picture2,picture3.
主对话框中只设置了一个按钮,可以进入picture2页面,picture2中只设置了一个按钮“next”,可以进入picture3页面,picture3中只设置了一个按钮“back”,可以返回picture2页面。
next按钮下用了
OnOK();
Cpicture3 pic3;
pic3.DoModal();
back按钮下用了
OnOK();
Cpicture2 pic2;
pic2.DoModal();我想实现两个子对话框页面的切换。一般情况下运行时,做picture2喝picture3之间的切换时没有问题的,但是切换的次数多了,可能二十次,程序就会死掉。
请高手指点下如何解决这个问题?

解决方案 »

  1.   


    调试了下,没发现什么原因。两界面间来回切换了越20次,才在pic3.DoModal();处程序死了。
      

  2.   

    里面有贴图吗?
    是不是loadbitamp出错了
      

  3.   

    哎,我这里打开CSDN的网页非常慢,一个网页刷新一下要几十分钟才打开,不知道大家的情况如何。我的机子前几天重装过系统,重装过VS2008,我用之前的工程运行,这次发现两个子对话框页面间切换大概300次的时候会出问题,不是原来的20次左右了。我就在picture2对话框中点“next”,切换到picture3对话框页面,然后在picture3上点“back”按钮,返回到picture2,然后反复,一直反复了大概300次才出问题。我用任务管理器盯着该程序进程的内存使用情况,从最开始的9.2000K,到26.200K的时候出的问题。表现是对话框消息了,但进程还在,弹出Visual Studio适时调试器,上面显示“dialogchange.exe[2996]中发生未处理的win32异常”帖部分文件代码:  
    // dialogchang.h : PROJECT_NAME 应用程序的主头文件
    //#pragma once#ifndef __AFXWIN_H__
    #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
    #endif#include "resource.h" // 主符号
    // CdialogchangApp:
    // 有关此类的实现,请参阅 dialogchang.cpp
    //
    class CdialogchangApp : public CWinApp
    {
    public:
    CdialogchangApp();
    // 重写
    public:
    virtual BOOL InitInstance();
    // 实现
    DECLARE_MESSAGE_MAP()
    };
    extern CdialogchangApp theApp;
    //Picture2.h
    #pragma once
    // CPicture2 对话框class CPicture2 : public CDialog
    {
    DECLARE_DYNAMIC(CPicture2)public:
    CPicture2(CWnd* pParent = NULL);   // 标准构造函数
    virtual ~CPicture2();// 对话框数据
    enum { IDD = IDD_picture2 };protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持 DECLARE_MESSAGE_MAP()
    public:
    afx_msg void OnBnClickedButton1();
    };//Picture3.h
    #pragma once
    // CPicture3 对话框class CPicture3 : public CDialog
    {
    DECLARE_DYNAMIC(CPicture3)public:
    CPicture3(CWnd* pParent = NULL);   // 标准构造函数
    virtual ~CPicture3();// 对话框数据
    enum { IDD = IDD_picture3 };protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持 DECLARE_MESSAGE_MAP()
    public:
    afx_msg void OnBnClickedButton1();
    };// dialogchang.cpp : 定义应用程序的类行为。
    //#include "stdafx.h"
    #include "dialogchang.h"
    #include "dialogchangDlg.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    // CdialogchangAppBEGIN_MESSAGE_MAP(CdialogchangApp, CWinApp)
    ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
    END_MESSAGE_MAP()
    // CdialogchangApp 构造CdialogchangApp::CdialogchangApp()
    {
    // TODO: 在此处添加构造代码,
    // 将所有重要的初始化放置在 InitInstance 中
    }
    // 唯一的一个 CdialogchangApp 对象CdialogchangApp theApp;
    // CdialogchangApp 初始化BOOL CdialogchangApp::InitInstance()
    {
    // 如果一个运行在 Windows XP 上的应用程序清单指定要
    // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
    //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    // 将它设置为包括所有要在应用程序中使用的
    // 公共控件类。
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); AfxEnableControlContainer(); // 标准初始化
    // 如果未使用这些功能并希望减小
    // 最终可执行文件的大小,则应移除下列
    // 不需要的特定初始化例程
    // 更改用于存储设置的注册表项
    // TODO: 应适当修改该字符串,
    // 例如修改为公司或组织名
    SetRegistryKey(_T("应用程序向导生成的本地应用程序")); CdialogchangDlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
    // TODO: 在此放置处理何时用
    //  “确定”来关闭对话框的代码
    }
    else if (nResponse == IDCANCEL)
    {
    // TODO: 在此放置处理何时用
    //  “取消”来关闭对话框的代码
    } // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
    //  而不是启动应用程序的消息泵。
    return FALSE;
    }// dialogchangDlg.h : 头文件
    //#pragma once
    // CdialogchangDlg 对话框
    class CdialogchangDlg : public CDialog
    {
    // 构造
    public:
    CdialogchangDlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据
    enum { IDD = IDD_DIALOGCHANG_DIALOG }; protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
    // 实现
    protected:
    HICON m_hIcon; // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
    public:
    afx_msg void OnBnClickedButton1();
    };
    // dialogchangDlg.cpp : 实现文件
    //#include "stdafx.h"
    #include "dialogchang.h"
    #include "dialogchangDlg.h"
    #include "Picture2.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    // 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialog
    {
    public:
    CAboutDlg();// 对话框数据
    enum { IDD = IDD_ABOUTBOX }; protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
    protected:
    DECLARE_MESSAGE_MAP()
    };CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    }BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
    // CdialogchangDlg 对话框
    CdialogchangDlg::CdialogchangDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CdialogchangDlg::IDD, pParent)
    {
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }void CdialogchangDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    }BEGIN_MESSAGE_MAP(CdialogchangDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_BN_CLICKED(IDC_BUTTON1, &CdialogchangDlg::OnBnClickedButton1)
    END_MESSAGE_MAP()
    // CdialogchangDlg 消息处理程序BOOL CdialogchangDlg::OnInitDialog()
    {
    CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE); // 设置大图标
    SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }void CdialogchangDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialog::OnSysCommand(nID, lParam);
    }
    }// 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。void CdialogchangDlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialog::OnPaint();
    }
    }//当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CdialogchangDlg::OnQueryDragIcon()
    {
    return static_cast<HCURSOR>(m_hIcon);
    }
    void CdialogchangDlg::OnBnClickedButton1()
    {
    // TODO: 在此添加控件通知处理程序代码
    OnOK();
    CPicture2 pic2;
    pic2.DoModal();
    }
    // Picture2.cpp : 实现文件
    //#include "stdafx.h"
    #include "dialogchang.h"
    #include "Picture2.h"
    #include "Picture3.h"
    // CPicture2 对话框IMPLEMENT_DYNAMIC(CPicture2, CDialog)CPicture2::CPicture2(CWnd* pParent /*=NULL*/)
    : CDialog(CPicture2::IDD, pParent)
    {}CPicture2::~CPicture2()
    {
    }void CPicture2::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    }
    BEGIN_MESSAGE_MAP(CPicture2, CDialog)
    ON_BN_CLICKED(IDC_BUTTON1, &CPicture2::OnBnClickedButton1)
    END_MESSAGE_MAP()
    // CPicture2 消息处理程序void CPicture2::OnBnClickedButton1()
    {
    // TODO: 在此添加控件通知处理程序代码
    CPicture3 pic3;
    OnOK();
    pic3.DoModal();
    }
    // Picture3.cpp : 实现文件
    //#include "stdafx.h"
    #include "dialogchang.h"
    #include "Picture3.h"
    #include "Picture2.h"// CPicture3 对话框IMPLEMENT_DYNAMIC(CPicture3, CDialog)CPicture3::CPicture3(CWnd* pParent /*=NULL*/)
    : CDialog(CPicture3::IDD, pParent)
    {}CPicture3::~CPicture3()
    {
    }void CPicture3::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    }
    BEGIN_MESSAGE_MAP(CPicture3, CDialog)
    ON_BN_CLICKED(IDC_BUTTON1, &CPicture3::OnBnClickedButton1)
    END_MESSAGE_MAP()
    // CPicture3 消息处理程序void CPicture3::OnBnClickedButton1()
    {
    // TODO: 在此添加控件通知处理程序代码
    CPicture2 pic2;
    OnOK();
    pic2.DoModal();
    }