发布网友 发布时间:2024-10-01 10:20
共1个回答
热心网友 时间:2024-10-20 12:42
当文档数据发生变化时,CDocument对象会调用UpdateAllView()来通知所有视图,进而触发视图的OnUpdate()方法。这个方法应根据文档更新内容在视图中做出相应的反应。CView::OnUpdate()通常会让客户区无效并重新绘制,例如:在CView::OnUpdate()的实现中,当接收到更新通知时,会简单地使客户区无效,并触发重绘过程,如:
void CView::OnUpdate(CView* pSender, LPARAM, CObject*){
ASSERT(pSender != this);
Invalidate(TRUE); // 重置客户区并使其重新绘制
}
OnInitialUpdate()方法在初次创建后或打开文件后被调用,基类CView::OnInitialUpdate()通常会调用OnUpdate()进行初始化。然而,它可能会被多次调用,需要注意。
void CView::OnInitialUpdate(){
OnUpdate(NULL, 0, NULL);
}
CalcWindowRect函数用于根据主框架窗口客户区尺寸变化或控件位置变动来重新计算视图窗口的尺寸。当主窗口客户区或控件布局更新时,CFrameWnd::RecalcLayout()会触发CalcWindowRect的调用。
代码示例:
void CView::CalcWindowRect(LPRECT lpClientRect, UNIT nAdjustType){
// ...根据窗口风格调整滚动条尺寸...
// 或在无需调整滚动条时,调用基类成员函数计算尺寸
CWnd::CalcWindowRect(lpClientRect, nAdjustType);
}
PostNcDestroy是视图关闭时最后调用的函数,它与CFrameWnd::PostNcDestroy有相同功能,即释放视图对象。代码如下:
void CView::PostNcDestroy(){
delete this;
}
OnCmdMsg函数在CFrameWnd::OnCmdMsg中已有讲解,略去详细代码,但其主要作用是处理命令消息,先在视图自身查找,如果未处理,则传递给文档对象。
OnActivateView在视图激活或失去活动状态时被调用,基础实现仅设置视图为焦点。具体如下:
void CView::OnActivateView(BOOL bActivate, CView* pActivateView, CView*){
UNUSED(pActivateView); // 在发布版本中忽略
if (bActivate) { // 视图处于活动状态
// ...设置焦点...
}
}
CView是视图是程序设计中使用率最高的窗口对象,它是用户的主要操作界面。因为它通常以某种形式表示文档数据,所以称之为视图。一个视图对象只关联一个文档对象;一个文档对象可以关联多个视图,每个视图对象以不同形式表示文档数据。