|
楼主 |
发表于 2005-7-22 21:36
|
显示全部楼层
class CMyFrame : public CMDIChildWnd
{
......
CSplitterWnd m_Splitter;
CSplitterWnd m_Splitter2;
}
(Step 2)、重载CMDIChildWnd::OnCreateClient函数,创建切分窗口。
BOOL CMyFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
BOOL btn = m_Splitter.CreateStatic(this,1,2);
btn |= m_Splitter.CreateView(0,0, RUNTIME_CLASS(CAVIDispView), CSize(100,100), pContext);
m_Splitter2.CreateStatic(&m_Splitter, 2, 1,
WS_CHILD | WS_VISIBLE | WS_BORDER,
m_Splitter.IdFromRowCol(0, 1));
btn |= m_Splitter2.CreateView(0, 0, RUNTIME_CLASS(CBMPView), CSize(100,100), pContext);
btn |= m_Splitter2.CreateView(1, 0, RUNTIME_CLASS(CAVIView), CSize(100,100), pContext);
return btn;
//return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}
CFrameWnd::OnCreateClient函数原形为:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CcreateContext * pContext);
缺省的CMDIChildWnd::OnCreateClient函数根据pContext参数提供的信息,调用CFrameWnd::CreateView函数创建一个视。可以重载该函数,加载CCreateContext对象中传递的值,或改变框架窗口主客户区中控制的创建方式。在上面的程序中,笔者 创建了3个切分窗口。比如打开了一个名为“a.avi”的文档,此时该文档将有3个视,一个框架窗口。如果执行了Window/New操作,则此时有一个文档,6个视和2个框架窗口。若该文档调用CDocument::UpdateAllViews函数,则这6个视的CView::OnUpdate函数都会被激发。
(3)、关于CCreateContext的讨论。
CCreateContext是MFC框架所使用的一种结构,它将构成文档/视的组件联系起来。这个结构包括指向文档的指针,框架窗口,视以及文档模板,它还包含一个指向CRuntimeClass的指针,以指明所创建的视的类型。其数据成员如下:
m_pNewViewClass:指向创建上下文的视的CRuntimeClass的指针。
m_pCurrentDoc:指向文档对象的指针,以和新视联系起来。
m_pNewDocTemplate:指向与框架窗口的创建相联系文档模板的指针。
m_pLastView:指向已存在的视,它是新产生的视的模型。
m_pCurrentFrame:指向已存在的框架窗口,它是新产生的框架窗口的模型。
程序员可以通过改变CCreateContext对象的值,来创建更加灵活的视。由于过程较复杂,笔者不再赘许叙,读者可参阅相关的Visual C++ Help文档。
(五)、结束语
Visual C++ 6.0的文档/视结构代表了一种新的程序设计方式,其核心是文档与视的分离,即数据存放与显示(操作)的分离。在MFC类库中,各个对象之间的关系很复杂,但,只要深入了解后,会发现它们之间是相互联系的,可以相互存取的。如果大家想设计出灵活、健壮的应用程序,就必须深入了解MFC。跟踪原代码就是一个较好的方法。文档/视的关系的确非常复杂,如果能知道每个函数是在哪调用的,执行了何种操作,就能游人刃有余,写出优美的应用程序。
[ 本帖最后由 风花雪月 于 2006-11-3 09:40 编辑 ] |
评分
-
1
查看全部评分
-
|