MFC 多文档和单文档一些问题请教。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC 多文档和单文档一些问题请教。相关的知识,希望对你有一定的参考价值。
我想做一个比如菜单栏的按钮点击,下面的框架相应地跳到对应的某个窗口。有些为视图对话框窗口。有些为文档窗口。请问下如何做呢?选择单文档还是多文档?下面框架的窗口如何去响应菜单栏按钮的点击?
修改文档标题最简洁的办法是在资源列表中的String Table里双击IDR_MAINFRAME在弹出的对话框中的caption编辑框的第一个'\n'和第二个'\n'中加入你自己的标题。当然你也可以动态地创建,在CMainFrame::PreCreateWindow中加入:cs.style&=~FWS_ADDTOTITLE; //直接去掉文档标题
cs.lpszName=_TEXT("程序标题");
也可以在C..Doc类的OnNewDocument函数中加入:
SetTitle("程序标题");
还有很多方法,在这里就不列出来了。 参考技术A 如果你是C++初学者,这个就先不要搞吧! 参考技术B 有一个方法,在app文件的InitInstance()函数中加入LoadStdProfileSettings(0),来禁止MRU,我一般是直接将这个函数注释掉的
MFC单文档 添加 多视图
转:http://ffwmxr.blog.163.com/blog/static/66372722201001605539213/
多视图是VC开发中经常要用到的技术之一,一般地实现单文档多视图有两种方式:
1)通过视图分割的技术(使用CSplitterWnd实现),将窗口分割为多个部分,每个部分显示各自显示不同的视图,这种技术实现起来比较简单,并且相关的资料也很多。
2)通过一个文档关联多个视图,窗口显示整个视图。
第二种实现较第一种复杂,这里给出详细的实现方法。
Step 1:使用VC 6.0新建一个Project,命名为:MultiView。除选择单文档属性外,一切使用“默认”方式。于是你可以获得五个类:CMainFrame ,CMultiViewApp,CMultiViewDoc,CMultiViewView,和CAboutDlg;
Step 2:新建一个新的视图View,添加一个新的MFC Class(Insert->New Class),基类为CView(或者CView的派生子类,如CEditView等)。类的名字为CAnotherView,这就是新的视图;并为CAnotherView添加GetDocument的实现:
CMultiViewDoc* CAnotherView::GetDocument() { return (CMultiViewDoc*)m_pDocument; } |
Step 3:在CMultiViewApp添加成员变量记录这两个视图:
private: CView* m_pFirstView; CView* m_pAnotherView; |
给程序菜单IDR_MAINFRAME添加一个菜单项目“视图”,该菜单项有两个子菜单“视图一”和“视图二”,添加相应函数(void CMultiViewApp:: OnShowFirstview()和void CMultiViewApp:: OnShowSecondview());
Step 4:创建新的视图:在BOOL CMultiViewApp::InitInstance()中添加代码:
……. //创建一个新的视图 CView* m_pActiveView = ((CFrameWnd*)m_pMainWnd)->GetActiveView(); m_pFirstView = m_pActiveView;
m_pAnotherView = new CAnotherView(); //实现文档和视图关联 CDocument* m_pDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();
CCreateContext context; context.m_pCurrentDoc = m_pDoc;
//创建视图的实现 UINT m_IDFORANOTHERVIEW = AFX_IDW_PANE_FIRST + 1; CRect rect; m_pAnotherView->Create(NULL,NULL,WS_CHILD,rect,m_pMainWnd, m_IDFORANOTHERVIEW,&context); …… |
Step 5:现在已经创建了视图,并且已经和文档关联起来了。现在要作的就是视图间的转换。在void CMultiViewApp:: OnShowFirstview()中添加实现代码:
void CMultiViewApp::OnShowFirstview() { // TODO: Add your command handler code here UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID); ::SetWindowLong(m_pAnotherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID)); ::SetWindowLong(m_pFirstView->m_hWnd, GWL_ID, temp);
m_pAnotherView->ShowWindow(SW_HIDE); m_pFirstView->ShowWindow(SW_SHOW);
((CFrameWnd*)m_pMainWnd)->SetActiveView(m_pFirstView); ((CFrameWnd*) m_pMainWnd)->RecalcLayout(); m_pFirstView->Invalidate(); } |
在void CMultiViewApp:: OnShowSecondview()中添加实现代码:
void CMultiViewApp::OnShowSecondview() { // TODO: Add your command handler code here UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID); ::SetWindowLong(m_pAnotherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID)); ::SetWindowLong(m_pFirstView->m_hWnd, GWL_ID, temp);
m_pFirstView->ShowWindow(SW_HIDE); m_pAnotherView->ShowWindow(SW_SHOW);
((CFrameWnd*)m_pMainWnd)->SetActiveView(m_pAnotherView); ((CFrameWnd*) m_pMainWnd)->RecalcLayout(); m_pAnotherView->Invalidate(); } |
Step 6:为了演示,这里将不同的视图给予一个标记,在CMultiViewView和CAnotherView的OnDraw方法中分别添加以下代码:
pDC->TextOut(400,300,"First View"); pDC->TextOut(400,320,pDoc->GetTitle()); |
和
pDC->TextOut(400,300,"Another View"); pDC->TextOut(400,320,pDoc->GetTitle()); |
至此就大功告成了,但是实现过程中有4点说明:
1) 实现中由于使用到相关的类,因此在必要的地方要include相关的头文件,这里省略;CAnotherView的默认构造函数是Protected的,需要将其改为Public,或者提供一个产生CAnotherView对象的方法(因要创建视图对象);
2) 这里给出的是一个示例代码,实际开发中可以通过参考实现获得自己想要实现的具体应用情况(例如视图类的不同、数量不同,更重要的还有业务逻辑的不同实现等);
以上是关于MFC 多文档和单文档一些问题请教。的主要内容,如果未能解决你的问题,请参考以下文章