2.1调用CFrameWnd::InitialUpdateFrame【winfrm.cpp732】
2.1.1将第一个视设置为活动视【winfrm.cpp742】
2.1.2给所有相关视图及控件发送WM_INITIALUPDATE消息【winfrm.cpp749】,这样导致视图的OnInitialUpdate函数被调用
2.1.2.1 CXXXView::OnInitialUpdate:(该函数可以被重载的)
2.1.2.1.1调用CView::OnUpdate函数
2.1.2.1.1.1调用CView::Invalidate(汇编代码)
2.1.3调用视图对象的OnActivateFrame以提供保存焦点的机会【winfrm.cpp753】
2.1.4调用CMDIChildWnd::ActivateFrame激活边框【winfrm.cpp764】
2.1.5调用CMDIChildWnd::OnUpdateFrameTitle【winfrm.cpp764】
2.1.5.1调用:CMDIFrameWnd::OnUpdateFrameTitle设置父窗体的标题
2.1.5.1.1如果具有FWS_ADDTOTITLE风格,则设置标题
2.1.5.2如果具有FWS_ADDTOTITLE风格,则设置子框架的标题【winmdi.cpp922】
2.2 CDocTemplate::InitialUpdateFrame执行完毕
1.2 修改标题的方法
方法1:去掉 FWS_ADDTOTITLE的窗体风格
从上述的“子框架窗口的创建过程”可以发现,和子框架的标题设置有关的是CDocTemplate::InitialUpdateFrame部分,在该函数执行的最后一步,会调用OnUpdateFrameTitle函数来设置子框架的标题信息。由于这个函数是窗体显示前的最后一步,因此,要是我们只是简单的直接在视图类中处理WM_INITIALUPDATE消息,即OnInitialUpdate中来调用SetWindowsText来设置子框架的标题的话,所设置的信息又会被OnUpdateFrameTitle所设置的标题覆盖。
不过,从OnUpdateFrameTitle的实现代码可以发现,在该函数中,进行了是否设置了FWS_ADDTOTITLE风格的判断,如果具有该风格,就给窗口设置一个默认的标题信息。在默认的情况下,CDocTemplate的CreateNewFrame函数以WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE为缺省风格来调用LoadFrame函数创建子框架,这样窗口的风格中就包含了FWS_ADDTOTITLE。不过,从上面的创建过程,也可以发现,在真正开始创建子框架之前,MFC会调用PreCreateWindow这个可被重载的函数,这样就给我们提供了一个机会来修改子框架的创建风格,于是,我们就找到了一个修改标题的方法,这个方法其实很简单,实施步骤如下:
第一步:重载CMDIChildFrame的PreCreateWindow函数,去掉FWS_ADDTOTITLE:
cs.style &= ~FWS_ADDTOTITLE;
第二步:处理视图的WM_INITIALUPDATE消息,在其中调用SetWindowText来把标题设置成想要的内容
方法2:重载OnUpdateFrameTitle函数
该函数是CMDIFrameWnd类的一个虚函数,在以前版本的MFC中,这个函数没有暴露出来,不过到了4.2之后,这个函数就已经可以方便的通过ClassWizard来进行重载了,因此,修改标题的最简单的方法就是重载此函数,在此函数中设置标题的内容。
不过,在重载此方法的时候,可以不调用基类的方法,如果要调用,则自己设置标题信息的代码一定要放置在基类方法的调用之后,自己设置的标题才不会被基类方法设置点标题覆盖。
SendMessageToDescendants:这个函数的作用是,向所有子窗口发送消息。