VS2015环境下,CPropertyPage中弹出对话框时,程序卡死

kevinjan 2018-02-05 05:27:12
新建一个工程CtrlSolution对话框程序,在工程中插入两个对话框:Satellite和TrackDataList,并添加相应的类CSatellite(继承CPropertyPage)和CTrackDataList(继承)。在工程中添加类Pcsheet(继承CPropertySheet),代码如下

//CtrlSolutionDlg.h
#pragma once
#include "Pcsheet.h"

// CCtrlSolutionDlg 对话框
class CCtrlSolutionDlg : public CDialogEx
{
// 构造
public:
CCtrlSolutionDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_CTRLSOLUTION_DIALOG };
#endif
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:
Pcsheet sheet;
};


// CtrlSolutionDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "CtrlSolution.h"
#include "CtrlSolutionDlg.h"
#include "afxdialogex.h"
#include "TrackDataList.h"

BOOL CCtrlSolutionDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加属性页
sheet.Create(this, WS_CHILD, 0);
sheet.MoveWindow(0, 690, 3000, 256);
sheet.ShowWindow(SW_SHOW);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
//Pcsheet.h
#include "Satellite.h"
class Pcsheet : public CPropertySheet
{
DECLARE_DYNAMIC(Pcsheet)

public:
Pcsheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
Pcsheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
virtual ~Pcsheet();
Pcsheet();

CSatellite satellitepage;

protected:
DECLARE_MESSAGE_MAP()
};


#include "stdafx.h"
#include "CtrlSolution.h"
#include "Pcsheet.h"
IMPLEMENT_DYNAMIC(Pcsheet, CPropertySheet)

Pcsheet::Pcsheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{

}

Pcsheet::Pcsheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
: CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{

}
Pcsheet::Pcsheet()
{

AddPage(&satellitepage);


}
Pcsheet::~Pcsheet()
{
}


BEGIN_MESSAGE_MAP(Pcsheet, CPropertySheet)
END_MESSAGE_MAP()

#pragma once


// CSatellite 对话框

class CSatellite : public CPropertyPage
{
DECLARE_DYNAMIC(CSatellite)

public:
CSatellite();
virtual ~CSatellite();

// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_SATELLITE_DIALOG };
#endif

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedbtnloadfile();
};

// Satellite.cpp : 实现文件
//

#include "stdafx.h"
#include "CtrlSolution.h"
#include "Satellite.h"
#include "afxdialogex.h"
#include "TrackDataList.h"

// CSatellite 对话框

IMPLEMENT_DYNAMIC(CSatellite, CPropertyPage)

CSatellite::CSatellite()
: CPropertyPage(IDD_SATELLITE_DIALOG)
{

}

CSatellite::~CSatellite()
{
}

void CSatellite::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CSatellite, CPropertyPage)
ON_BN_CLICKED(IDC_btnloadfile, &CSatellite::OnBnClickedbtnloadfile)
END_MESSAGE_MAP()


// CSatellite 消息处理程序


BOOL CSatellite::OnInitDialog()
{
CPropertyPage::OnInitDialog();

// TODO: 在此添加额外的初始化
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}


void CSatellite::OnBnClickedbtnloadfile()
{
// TODO: 在此添加控件通知处理程序代码
CTrackDataList*DataListdlg = new CTrackDataList;
if (DataListdlg->GetSafeHwnd() == 0)
{
DataListdlg->Create(IDD_TRACKDATA_LIST);
}
DataListdlg->ShowWindow(SW_SHOW);
}


#pragma once


// CTrackDataList 对话框

class CTrackDataList : public CDialogEx
{
DECLARE_DYNAMIC(CTrackDataList)

public:
CTrackDataList(CWnd* pParent = NULL); // 标准构造函数
virtual ~CTrackDataList();

// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_TRACKDATA_LIST };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
};

// TrackDataList.cpp : 实现文件
//

#include "stdafx.h"
#include "CtrlSolution.h"
#include "TrackDataList.h"
#include "afxdialogex.h"


// CTrackDataList 对话框

IMPLEMENT_DYNAMIC(CTrackDataList, CDialogEx)

CTrackDataList::CTrackDataList(CWnd* pParent /*=NULL*/)
: CDialogEx(IDD_TRACKDATA_LIST, pParent)
{

}

CTrackDataList::~CTrackDataList()
{
}

void CTrackDataList::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CTrackDataList, CDialogEx)
END_MESSAGE_MAP()


// CTrackDataList 消息处理程序


BOOL CTrackDataList::OnInitDialog()
{
CDialogEx::OnInitDialog();

// TODO: 在此添加额外的初始化
//InitList();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}



问题:在属性页上点击按钮button1调用Trackdatalist对话框程序卡死,调试时发现是创建对话框DataListdlg->Create(IDD_TRACKDATA_LIST)卡死,而且在button1中调用AfxMessageBox(_T("111"));也卡死不成功。同样的程序在VS2010上没有问题,请问是哪里的问题,求救啊。
...全文
1071 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2018-02-07
  • 打赏
  • 举报
回复
把 IDD_SATELLITE_DIALOG 资源的 WS_DISABLED 属性取消试试看
kevinjan 2018-02-07
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
对话框资源编辑器中Dialog的Style是Child风格??
是child风格,不知道是哪边的问题?
zgl7903 2018-02-06
  • 打赏
  • 举报
回复
试试 EnableWindow sheet.Create(this, WS_CHILD, 0); if(sheet.m_hWnd) sheet.EnableWindow(TRUE);
Eleven 2018-02-06
  • 打赏
  • 举报
回复
对话框资源编辑器中Dialog的Style是Child风格??

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧