请高手帮忙(用doModal函数创建对话框出错的问题)

yhb688 2016-12-30 07:31:25
在单文档的view.cpp中编写菜单的响应,内容是创建一个对话框。在调试中发现,总是在DoMadal这一步出错。求高手指点!
具体出错的代码如下:
void CMFCApplication12View::OnSet()
{
// TODO: 在此添加命令处理程序代码
shezhidialog szdlg;//shezhidialog是我定义的对话框的类
szdlg.DoModal();
}

我曾经尝试用create去做,然而还是在相同的位置出错。
错误信息:
...全文
1318 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
走好每一步 2017-02-09
  • 打赏
  • 举报
回复
引用 6 楼 fengwanfengwan 的回复:
碰到这种问题,就在窗口初始化所经过的每个地方加上断点,问题还是很好解决的。
正道,多加点断点,错误很容易发现的。
OnTheWay_Boy 2017-02-07
  • 打赏
  • 举报
回复
资源创建,构造,onini,这三个地方,目测第一个可能性最大
fengwanzk 2017-01-29
  • 打赏
  • 举报
回复
碰到这种问题,就在窗口初始化所经过的每个地方加上断点,问题还是很好解决的。
Eleven 2017-01-24
  • 打赏
  • 举报
回复
Debug一下你的shezhidialog类中初始化的代码,比如构造函数,OnInitDialog函数等。
qq_36634306 2017-01-24
  • 打赏
  • 举报
回复
前几天刚碰到过,检查控件的ID
sdghchj 2017-01-04
  • 打赏
  • 举报
回复
这个问题基本都是对话框内控件对象的句柄无效。
oyljerry 2016-12-31
  • 打赏
  • 举报
回复
在对话框的OnInitDialog 中看看是不是初始化有问题
yhb688 2016-12-30
  • 打赏
  • 举报
回复
整个View.cpp如下:
// MFCApplication12View.cpp : CMFCApplication12View 类的实现
//

#include "stdafx.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "MFCApplication12.h"
#endif

#include "MFCApplication12Doc.h"
#include "MFCApplication12View.h"

#include "leiqudialog.h"
#include "shezhidialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMFCApplication12View

IMPLEMENT_DYNCREATE(CMFCApplication12View, CView)

BEGIN_MESSAGE_MAP(CMFCApplication12View, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
//ON_COMMAND(IDR_MENU_POP, &CView::OnOperShow) //消息响应
ON_WM_RBUTTONDOWN()
ON_COMMAND(ID_RESTART, &CMFCApplication12View::OnRestart)
ON_COMMAND(ID_SET, &CMFCApplication12View::OnSet)
END_MESSAGE_MAP()

//int hang=9,lie=9,leishu=10;

// CMFCApplication12View 构造/析构

CMFCApplication12View::CMFCApplication12View()
{
// TODO: 在此处添加构造代码
m_PopMenu.LoadMenu(IDR_MENU_POP); // 创建并加载菜单资源
//gamedlg=new leiqudialog;
//szdlg=new shezhidialog;
//leiqudialog gamedlg;
//gamedlg.Create(IDD_DIALOG1);
}

CMFCApplication12View::~CMFCApplication12View()
{
m_PopMenu.DestroyMenu(); // 释放菜单资源
//delete gamedlg;
//delete szdlg;
}

BOOL CMFCApplication12View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式

return CView::PreCreateWindow(cs);
}

// CMFCApplication12View 绘制

void CMFCApplication12View::OnDraw(CDC* /*pDC*/)
{
CMFCApplication12Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: 在此处为本机数据添加绘制代码
}


// CMFCApplication12View 打印

BOOL CMFCApplication12View::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}

void CMFCApplication12View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}

void CMFCApplication12View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清理过程
}


// CMFCApplication12View 诊断

#ifdef _DEBUG
void CMFCApplication12View::AssertValid() const
{
CView::AssertValid();
}

void CMFCApplication12View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

CMFCApplication12Doc* CMFCApplication12View::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplication12Doc)));
return (CMFCApplication12Doc*)m_pDocument;
}
#endif //_DEBUG


// CMFCApplication12View 消息处理程序


void CMFCApplication12View::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

m_pPop = m_PopMenu.GetSubMenu(0); // 获得第一个子菜单

ClientToScreen(&point); // 将坐标由客户坐标转化为屏幕坐标
m_pPop->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
// 显示Pop-up菜单

CView::OnRButtonDown(nFlags, point);
}

//leiqudialog gamedlg;
int cishu=0;

void CMFCApplication12View::OnRestart()
{
// TODO: 在此添加命令处理程序代码

//delete gamedlg;
//gamedlg=new leiqudialog;

leiqudialog gamedlg;
gamedlg.DoModal();

//cishu++;
//gamedlg->Create(IDD_DIALOG1);
//gamedlg->ShowWindow(SW_SHOW);
//gamedlg->DestroyWindow();
//delete gamedlg;
//Invalidate();

}


void CMFCApplication12View::OnSet()
{
// TODO: 在此添加命令处理程序代码
//delete szdlg;
shezhidialog szdlg;
szdlg.DoModal();
//szdlg.DestroyWindow();
//szdlg=new shezhidialog;
//szdlg->Create(IDD_DIALOG3);
//szdlg->ShowWindow(SW_SHOW);


Invalidate();
}
采用MFC编程时,子对话框常常要向主窗口传递数据,获取主窗口的对象指针便显得非常重要了。 void CMyView::OnModel() //点击菜单,创建对话框的几种变量设置,总共是4种方法,模态的一种,非模态的三种 { // TODO: Add your command handler code here //CDialog modDlg(MAKEINTRESOURCE(IDD_MODEL),this); //modDlg.DoModal(); static bool num=0;//第一次执行第一段,以后再打开都执行第二段。 static CModDlg Dlgless(this);//将MyView指针传进去 if (0==num) { CModDlg mod(this);//将MyView指针传进去 //mod.SetWindowText("局部变量——模态对话框");不允许动态设置模态对话框标题?这句编绎会出错 mod.DoModal(); Dlgless.Create(IDD_MODEL);//重复执行会出错,要放到构造函数中好 Dlgless.ShowWindow(SW_SHOW); Dlgless.SetWindowText("局部静态变量——非模对话框"); m_dlgless.Create(IDD_MODEL,this);//重复执行会出错,要放到构造函数中好 m_dlgless.ShowWindow(SW_SHOW); m_dlgless.SetWindowText("成员非指针变量——非模对话框"); m_pDlgless=new CModDlg(this);//重复执行会出错,要放到构造函数中好, m_pDlgless->Create(IDD_MODEL);//重复执行会出错,要放到构造函数中好, m_pDlgless->ShowWindow(SW_SHOW); m_pDlgless->SetWindowText("成员指针变量——非模对话框"); num=1; } else { Dlgless.ShowWindow(SW_SHOW); m_dlgless.ShowWindow(SW_SHOW); m_pDlgless->ShowWindow(SW_SHOW); } }

2,586

社区成员

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

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