主对话框为dialogchange,两个子对话框picture2,picture3.
主对话框中只设置了一个按钮,可以进入picture2页面,picture2中只设置了一个按钮“next”,可以进入picture3页面,picture3中只设置了一个按钮“back”,可以返回picture2页面。
next按钮下用了
OnOK();
Cpicture3 pic3;
pic3.DoModal();
back按钮下用了
OnOK();
Cpicture2 pic2;
pic2.DoModal();我想实现两个子对话框页面的切换。一般情况下运行时,做picture2喝picture3之间的切换时没有问题的,但是切换的次数多了,可能二十次,程序就会死掉。
请高手指点下如何解决这个问题?
主对话框中只设置了一个按钮,可以进入picture2页面,picture2中只设置了一个按钮“next”,可以进入picture3页面,picture3中只设置了一个按钮“back”,可以返回picture2页面。
next按钮下用了
OnOK();
Cpicture3 pic3;
pic3.DoModal();
back按钮下用了
OnOK();
Cpicture2 pic2;
pic2.DoModal();我想实现两个子对话框页面的切换。一般情况下运行时,做picture2喝picture3之间的切换时没有问题的,但是切换的次数多了,可能二十次,程序就会死掉。
请高手指点下如何解决这个问题?
调试了下,没发现什么原因。两界面间来回切换了越20次,才在pic3.DoModal();处程序死了。
是不是loadbitamp出错了
// 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();
}