创建自定义窗口失败 CreateNewFrame()返回值NULL

asdjy123 2013-08-09 10:26:55
背景:多文档,VS2010
//告警子框架窗口的创建
void CDrawYunApp::WarnData()
{
CWarnDoc * doc = new CWarnDoc(_T("报警提示"));
//CWarnFrm * frm = new CWarnFrm;
CFrameWnd* wnd = pWarnDocTemplate->CreateNewFrame(doc,NULL);//是子框架窗口开始创建的起点
if (wnd)
{
pWarnDocTemplate->InitialUpdateFrame(wnd,doc,TRUE);//会调用CWarnView::OnInitialUpdate(),没这句告警窗口不弹
}
}

创建时发现 wnd=NULL,使得创建失败,单步调试进入CreateNewFrame(doc,NULL),发现CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject()出现pFrame为NULL(正常不为NULL)
进入CreateObject(),发现是m_pfnCreateObject=NULL的问题。,
为什么m_pfnCreateObject为空,或者m_pfnCreateObject什么时候赋值(m_pfnCreateObject为结构体CRuntimeClass的成员)。

// 注册应用程序的文档模板。文档模板
// 将用作文档、框架窗口和视图之间的连接
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_DrawYunTYPE,
RUNTIME_CLASS(CDrawYunDoc),
RUNTIME_CLASS(CSplitFrame), // 自定义 MDI 子框架class CSplitFrame : public CMDIChildWndEx
RUNTIME_CLASS(CDrawYunView));
if (!pDocTemplate)
return FALSE;
pDocTemplate->SetContainerInfo(IDR_DrawYunTYPE_CNTR_IP);//调用此函数在OLE对象被内部激活时设置所使用的资源。
AddDocTemplate(pDocTemplate);//调用这个成员函数,将文档模板加入应用程序维护的可用文档模板列表中。你可以在调用RegisterShellFileTypes之前加入所有的文档模板。

//////////////上面创建模板这一块是创建多文档中的生成的,下面的自己手动添加//////////////////

// 注册应用程序的文档模板。文档模板
//将用作告警文档、框架窗口和告警视图之间的连接
pWarnDocTemplate = new CMultiDocTemplate(IDR_DrawYunTYPE,
RUNTIME_CLASS(CWarnDoc),
RUNTIME_CLASS(CWarnFrm), //class CWarnFrm : public CMDIChildWndEx
RUNTIME_CLASS(CWarnView));
if (!pWarnDocTemplate)
return FALSE;
pDocTemplate->SetContainerInfo(IDR_DrawYunTYPE_CNTR_IP);//调用此函数在OLE对象被内部激活时设置所使用的资源。

其中把CWarnFrm换成CSplitFrame就能创建成功,是否用自定义的CWarnFrm还要添加别的什么东西?如果是为什么用自定义的CWarnDoc和CWarnView不需添加,求了解或知道的多发言指导讨论
...全文
282 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2013-08-09
  • 打赏
  • 举报
回复
引用 4 楼 asdjy123 的回复:
[quote=引用 3 楼 VisualEleven 的回复:] [quote=引用 2 楼 asdjy123 的回复:] [quote=引用 1 楼 VisualEleven 的回复:] 你在App类的InitInstance里不是已经关联框架 子框架 文档和View视图了吗?为什么在CDrawYunApp::WarnData函数中又创建?你的WarnData又是被谁调用的?
在View中达到一定条件时就调用WarnData()动态创建一个告警窗口, 创建一个子窗口不是需要在App类是InitInstance()只是进行关联,再调用CreateNewFrame()创建??[/quote] 你弹一个警告窗口,你用个模态对话框不就完了,还搞个框架窗口,是不是搞复杂了呢?[/quote] 主要是告警窗口的一些东西已经创建好了,就是出现个问题:在子窗口最大化的情况下创建的告警窗口也会最大化的问题,从而考虑用框架能否解决此问题,但使用框架创建又出现问题。 具体未解决在(子窗口置顶和子窗口设置大小 多文档-SetWindowPos()无效:http://bbs.csdn.net/topics/390538392)帮忙看看解决此问题就把两贴结了 搞了一个星期先还没解决,如果解决不了,就要考虑改用对话框。 用对话框的话还要设置在:里面还要嵌个CListCtrl显示内容,这应该可以吧?[/quote] 可以,对话框里放CListCtrl控件肯定是没有问题的
asdjy123 2013-08-09
  • 打赏
  • 举报
回复
引用 3 楼 VisualEleven 的回复:
[quote=引用 2 楼 asdjy123 的回复:] [quote=引用 1 楼 VisualEleven 的回复:] 你在App类的InitInstance里不是已经关联框架 子框架 文档和View视图了吗?为什么在CDrawYunApp::WarnData函数中又创建?你的WarnData又是被谁调用的?
在View中达到一定条件时就调用WarnData()动态创建一个告警窗口, 创建一个子窗口不是需要在App类是InitInstance()只是进行关联,再调用CreateNewFrame()创建??[/quote] 你弹一个警告窗口,你用个模态对话框不就完了,还搞个框架窗口,是不是搞复杂了呢?[/quote] 主要是告警窗口的一些东西已经创建好了,就是出现个问题:在子窗口最大化的情况下创建的告警窗口也会最大化的问题,从而考虑用框架能否解决此问题,但使用框架创建又出现问题。 具体未解决在(子窗口置顶和子窗口设置大小 多文档-SetWindowPos()无效:http://bbs.csdn.net/topics/390538392)帮忙看看解决此问题就把两贴结了 搞了一个星期先还没解决,如果解决不了,就要考虑改用对话框。 用对话框的话还要设置在:里面还要嵌个CListCtrl显示内容,这应该可以吧?
Eleven 2013-08-09
  • 打赏
  • 举报
回复
引用 2 楼 asdjy123 的回复:
[quote=引用 1 楼 VisualEleven 的回复:] 你在App类的InitInstance里不是已经关联框架 子框架 文档和View视图了吗?为什么在CDrawYunApp::WarnData函数中又创建?你的WarnData又是被谁调用的?
在View中达到一定条件时就调用WarnData()动态创建一个告警窗口, 创建一个子窗口不是需要在App类是InitInstance()只是进行关联,再调用CreateNewFrame()创建??[/quote] 你弹一个警告窗口,你用个模态对话框不就完了,还搞个框架窗口,是不是搞复杂了呢?
asdjy123 2013-08-09
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
你在App类的InitInstance里不是已经关联框架 子框架 文档和View视图了吗?为什么在CDrawYunApp::WarnData函数中又创建?你的WarnData又是被谁调用的?
在View中达到一定条件时就调用WarnData()动态创建一个告警窗口, 创建一个子窗口不是需要在App类是InitInstance()只是进行关联,再调用CreateNewFrame()创建??
Eleven 2013-08-09
  • 打赏
  • 举报
回复
你在App类的InitInstance里不是已经关联框架 子框架 文档和View视图了吗?为什么在CDrawYunApp::WarnData函数中又创建?你的WarnData又是被谁调用的?
asdjy123 2013-08-09
  • 打赏
  • 举报
回复
发现了原来创建时要添加ShowWindow(WS_SHOW),才能显示。 发现点击对话框的右上角的“X”之后没有调用对话框的消息函数OnDestory(),只有在关闭整个程序时才调用,是不是点“X”是把程序给隐藏掉了,怎么实现的调用OnDestory()?或者说点“X”是调用OnClose()函数?
asdjy123 2013-08-09
  • 打赏
  • 举报
回复
引用 5 楼 VisualEleven 的回复:
创建对话框之后没显示,应该怎么修改

//创建告警对话框
void CDrawYunApp::WarnData() 
{	
	CWarnDlg *warnDlg = new CWarnDlg;
	warnDlg->Create(IDD_WARN_SHOW,0);

}

//告警对话框初始化
BOOL CWarnDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	CMainFrame* pMW=(CMainFrame*)AfxGetApp()->m_pMainWnd;
	pMW->WarnHwnd= (*this).m_hWnd;

	 ListCount=0;

	// TODO: Add your specialized code here and/or call the base class
	 CListCtrl& m_list =m_List;//m_List:CListCtrl m_List;DDX_Control(pDX, IDC_LIST, m_List);
	LONG lStyle;
	lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口风格
	lStyle &= ~LVS_TYPEMASK; //清除显示方式位
	lStyle |= LVS_REPORT; //设置报表风格
	//cs.style &=~WS_CHILD;//清除窗口的子窗口形式
    //cs.style =WS_POPUP;//设置窗口为主窗口

	SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle); //设置窗口风格 
	DWORD dwStyle = m_list.GetExtendedStyle();//得到当前的列表视图控件扩展的样式

	//选中某行使整行高亮(只适用于报表风格的listctrl)
	dwStyle |= LVS_EX_FULLROWSELECT;
	dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与报表风格的listctrl)
	m_list.SetExtendedStyle(dwStyle); //设置扩展风格
	m_list.SetBkColor(RGB(200, 200, 200)); //设置背景颜色
	m_list.SetTextBkColor(RGB(200, 200, 200)); //设置文本背景颜色
	m_list.SetTextColor(RGB(10, 10, 80)); //设置文本颜色
 
	//插入列的标题,为了简单起见,我只插入三列
	m_list.InsertColumn( 0, _T("序号"), LVCFMT_CENTER, 40 );
	m_list.InsertColumn( 1, _T("装置名称"), LVCFMT_CENTER, 150 );//第三个参数为宽度,单位为像素
	m_list.InsertColumn( 2, _T("类型"), LVCFMT_CENTER, 110 );
	m_list.InsertColumn( 3, _T("系统时间"), LVCFMT_CENTER, 220 );
	m_list.InsertColumn( 4, _T("描述"), LVCFMT_CENTER, 330 );
	
	//int i=SetWindowPos(&wndTopMost,100,200,0,0,SWP_NOSIZE);//使告警窗口置最前
 
	// TODO:  Add extra initialization here

	return TRUE;  // return TRUE unless you set the focus to a control
	// EXCEPTION: OCX Property Pages should return FALSE
}
asdjy123 2013-08-09
  • 打赏
  • 举报
回复
创建非模态对话框能一直显示在最前面吗?如工具条一样
引用 5 楼 VisualEleven 的回复:
[quote=引用 4 楼 asdjy123 的回复:] [quote=引用 3 楼 VisualEleven 的回复:] [quote=引用 2 楼 asdjy123 的回复:] [quote=引用 1 楼 VisualEleven 的回复:] 你在App类的InitInstance里不是已经关联框架 子框架 文档和View视图了吗?为什么在CDrawYunApp::WarnData函数中又创建?你的WarnData又是被谁调用的?
在View中达到一定条件时就调用WarnData()动态创建一个告警窗口, 创建一个子窗口不是需要在App类是InitInstance()只是进行关联,再调用CreateNewFrame()创建??[/quote] 你弹一个警告窗口,你用个模态对话框不就完了,还搞个框架窗口,是不是搞复杂了呢?[/quote] 主要是告警窗口的一些东西已经创建好了,就是出现个问题:在子窗口最大化的情况下创建的告警窗口也会最大化的问题,从而考虑用框架能否解决此问题,但使用框架创建又出现问题。 具体未解决在(子窗口置顶和子窗口设置大小 多文档-SetWindowPos()无效:http://bbs.csdn.net/topics/390538392)帮忙看看解决此问题就把两贴结了 搞了一个星期先还没解决,如果解决不了,就要考虑改用对话框。 用对话框的话还要设置在:里面还要嵌个CListCtrl显示内容,这应该可以吧?[/quote] 可以,对话框里放CListCtrl控件肯定是没有问题的[/quote]

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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