移动或改变视图的大小实际上移动与其关联的父框架窗口。因此,初始化位置的行为既可以在视图的框架窗口类中实现,也可以在视图类中实现,下面提供了2中实现方法。
第一种技术:在视图的框架窗口类中实现该行为
第1步:使用ClassWizard创建一个新的CMDIChildWnd派生类,该类将实现所希望的初始化视图位置的行为。
第2步:使用ClassWizard为CMDIChildWnd派生类增加WM_CREATE消息处理函数,该函数的实现代码如下:
int CCenterChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CMDIChildWnd::OnCreate(lpCreateStruct)==-1) return -1; //把窗口设置为主框架窗口客户区的1/4,并置于中央 CWnd* pMDIClient=GetParent(); ASSERT_VALID(pMDIClient); CRect rect; pMDIClient->GetClientRect(&rect); MoveWindow(rect.Width()/4 , rect.Height()/4 , rect.Width()/2 , rect.Height()/2 ); return 0; }
第3步:不要忘记在适当的文档模板中说明视图框架窗口,以得到所希望的行为。
第2中技术:在视图类中实现该行为
在视图类中使用ClassWizard重载OnInitialUpdate()虚函数,该函数的实现如下面的程序清单所示,每次创建一个新视图时,它把父框架窗口移动到所希望的位置。
void CDrawView::OnInitialUpdate() { //首先调用基类 CView::OnInitialUpdate(); //1、得到父框架窗口的指针 CFrameWnd* pParentFrame=GetParentFrame(); ASSERT_VALID(pParentFrame); //2、得到MDI客户区窗口窗口的指针 CWnd* pMDIClient=pParentFrame->GetParent(); ASSERT_VALID(pMDIClient); //3、计算MDI成员窗口的大小 CRect retc; pMDIClient->GetClientRect(&rect); //4、把父框架窗口移动到希望的位置 pParentFrame->MoveWindow(rect.Width()/2 , 0 , rect.Width()/2 , rect.Height()/2); }