我原来做好了一个多文档程序,现在要增加一个数据库视图,所以加了一个菜单响应函数,其中的代码如下,程序能运行,但是我选“显示数据库”菜单时弹出错误:“命令失败”,不能显示新的视图。请问代码错在哪里?如何改正。
CMDIChildWnd* pChild=MDIGetActive();
CDocument* pDocument;
if(pChild==NULL||(pDocument=pChild->GetActiveDocument())==NULL)
{
TRACE0("No active document for WindowNew command.\n");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return;
}
CMiniDrawApp* pApp=(CMiniDrawApp*)AfxGetApp();
CDocTemplate* pTemplate=pApp->GetDocTemplate2();
ASSERT_VALID(pTemplate);
CFrameWnd* pFrame=pTemplate->CreateNewFrame(pDocument,pChild);
if(pFrame==NULL)
{
TRACE0("Failed to create new frame");
pTemplate->InitialUpdateFrame(pFrame,pDocument);
}另外,我用的是.dll,要装了vc才能运行,在没有vc的电脑运行不了,请问怎样修正这个缺点?
CMDIChildWnd* pChild=MDIGetActive();
CDocument* pDocument;
if(pChild==NULL||(pDocument=pChild->GetActiveDocument())==NULL)
{
TRACE0("No active document for WindowNew command.\n");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return;
}
CMiniDrawApp* pApp=(CMiniDrawApp*)AfxGetApp();
CDocTemplate* pTemplate=pApp->GetDocTemplate2();
ASSERT_VALID(pTemplate);
CFrameWnd* pFrame=pTemplate->CreateNewFrame(pDocument,pChild);
if(pFrame==NULL)
{
TRACE0("Failed to create new frame");
pTemplate->InitialUpdateFrame(pFrame,pDocument);
}另外,我用的是.dll,要装了vc才能运行,在没有vc的电脑运行不了,请问怎样修正这个缺点?
解决方案 »
- 请问VC++如何获得没有标题的对话框的句柄?
- mfc对话框程序退出时想删除一个文件
- 一个图像检测软件外包,有意者联系
- 如何获得picture控件右下角那个点的坐标值?
- 结束线程时,释放线程所占用的资源问题
- 知道父窗口的句柄``我想获得该窗口里的文本框的句柄````
- 怎样获得 程序 当前所在路径??还有启动时所在路径?
- 谁有《VisualC++实践与提高系列丛书-网络编程篇》这本书的电子版?
- 如何在以一个文件对话框中选择多个文件??
- 如何给QQ摄像头获取的视频加上特效,用于QQ视频聊天
- 需要做PDF的电子签章,做一个Acrobat Reader的COM组件,帮忙找点资源哈:)
- ATL编程中idl文件结构的理解?请高手详细指点一下?
{
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_TESTTYPE,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CTestView));
AddDocTemplate(pDocTemplate);
this->m_pTestTemplate=pDocTemplate;
pDocTemplate->OpenDocumentFile(NULL);
}
else
{
POSITION p=this->m_pTestTemplate->GetFirstDocPosition();
if(p)//活动文档存在
{
CDocument* pDoc=this->m_pTestTemplate->GetNextDoc(p);
p=pDoc->GetFirstViewPosition();
if(p)//视存在
{
CView* pView=pDoc->GetNextView(p);
pView->GetParentFrame()->BringWindowToTop();
}
}
else
{
this->m_pTestTemplate->OpenDocumentFile(NULL);
}
}
===
project->setting->use mfc in static
可以把用到的dll带上,然后发布
再但文档中,无非就是创建新的视图类对象,切断原来视图类与文档类的联系,将新的视图与文档类关联,以下代码仅供参考:
void SwitchToForm()
{
CView *pOldActiveView=GetActiveView(); //保存旧视图
CView *pNewActiveView=(CView*)GetDlgItem(nForm); //取得新视图
if(pNewActiveView==NULL)
{
pNewActiveView=(CView*)new CView1;//CView1是FormView1的派生类
CCreateContext context; //将文挡和视图相连
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL, NULL, WS_BORDER|WS_CHILD ,
CFrameWnd::rectDefault, this, nForm, &context);
pNewActiveView->OnInitialUpdate();
}
SetActiveView(pNewActiveView); //改变活动的视图
pNewActiveView->ShowWindow(SW_SHOW); //显示新的视图
pOldActiveView->ShowWindow(SW_HIDE); //隐藏旧的视图 if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView1))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM1); pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); delete pOldActiveView; //删除旧视图
RecalcLayout(); //调整框架窗口
}
我原来没有说清楚,我上面的那段代码是写在CMainFrame类的彩单中,所以laiyiling你的代码中的this后面的变量都没有,编译报错。ldiqing你的代码要删去原来的视图,我的是要同时有两个视图。
请各位能进一步赐教,谢谢!
我用laiyiling的方法实现了在没有vc的环境也能运行,不过oyljerry说的对,文件变大,请问怎么把ddll带上?报错时说找不到MFC42.dll,把它拷过去后好像要注册吧?要怎样做呢?
CDocument* pDocument;
if(pChild==NULL||(pDocument=pChild->GetActiveDocument())==NULL)
{
TRACE0("No active document for WindowNew command.\n");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return;
}
CMiniDrawApp* pApp=(CMiniDrawApp*)AfxGetApp();
CDocTemplate* pTemplate=pApp->GetDocTemplate2();
ASSERT_VALID(pTemplate);
CFrameWnd* pFrame=pTemplate->CreateNewFrame(pDocument,pChild);
if(pFrame==NULL)
{
TRACE0("Failed to create new frame");
pTemplate->InitialUpdateFrame(pFrame,pDocument);
}
经过测试,我发现是第一行返回的是空指针,请问应该怎么改正啊?各位大侠帮帮忙。