2009-9-7
========================================================
《深入解析MFC》笔记 8.MFC的文档/视图结构 拓展
========================================================
----------------------------
CMirrorFile 《深入解析MFC》 P221
CMirrorFile::Open() (DOCCORE.CPP)
第一部分:先检查 modeCreate,看调用者是想创建一个新文件还是想连接在已有文件后面。
然后调用CFile::GetStatus(),若文件非空,返回一个非零的数;
若文件存在,Open()接着会调用GetDiskFreeSpace(),确定驱动器有多少字节可以用。将结果和已有文件大小的两倍进行比较。
若大于后者,创建一个临时文件,文件名存储在 m_strMirrorName 中。
第二部分当 m_strMirrorName 非空时执行。
调用 CFile::Open() 打开镜像文件,然后将文件的时间和文件权限从源文件拷贝给镜像文件。
若执行了第二部分,Open() 返回TRUE,若没有被执行,会调用 CFile::Open(), 返回调用结果。
(若有写操作正在执行或者有文件被覆盖,CMirrorFile::Open() 就打开一个和指定文件不同的文件。
CMirrorFile::Close()
先在 m_strName 存储文件的名字,在调用CFile::Close() 之后,检查是否使用了镜像文件,若使用了,Open()会删除指定 文件,将文件拷贝为指定文件。
即CMirrorFile 通过保存原有文件和对临时文件进行写操作来保护你的文档。
这样,若写操作出现问题,源文件也是安全的 。
CMirrorFile 还会确保源文件的安全性以 及文件创建信息是否能被正确地拷贝
---------------------------
CView 打印 《深入解析MFC》 P223 - 235
---------------------------
CView的派生类: CScrollView
调用SetScrollSizes() 让 CScrollView 知道你的“逻辑视图”的大小,获得大小信息后,操纵传递给 OnDraw() 的DC,从而支持滚动
CScrollView 如何运作:
CScrollView ( VIEWSCRL.CPP )
· m_nMapMode —— 在 SetScrollSizes() 中,可以为应用程序指定一个映射模式。默认为MM_NONE,CScrollView定义为(MM_SCALETOFIT)。
· m_totalLog —— 逻辑坐标中视图的大小,这个值通过 SetScrollSizes() 成员函数传递给 CScrollView。
· m_totalDev —— 设备坐标中视图的大小。
· m_pageDev —— 设备坐标中一个页的大小。
· m_lineDev —— 设备中一条线的大小。
· m_bCenter —— CPreviewView 使用这个数据成员进入窗口中的视图。
· CenterOnPoint() —— 将视图集中于一点,由 CPreviewView 调用
· ScrollToDevicePosition() —— 负责滚动视图。通过调用::SetScrollPos() 和 ::CSrollWindow() 更新滚动条,来完成视图的滚动条。
· UpdateBars() —— CScrollView 在初始化的时候和窗口大小发生变化的时候调用。责任是根据 GetScrollBarState() 的返回信息隐藏、显示、初始化滚动条。
· GetTrueClientSize() —— 用来确定用户视图是否足够大(是否需要滚动条),只有 UpdateBars 才会调用这个函数。
· GetScrollBarSizes() —— 确定滚动条的宽度和高度,考虑了窗口的风格和边框的宽度。
· GetScrollBarState() —— 获取 CScrollView 所需要的关于视图的状态。
· CalcWindowRect() —— 计算窗口矩形的大小,考虑滚动条和其他窗口饰物的大小。
· OnPrepareDC() —— CScrollView 和 ONVScroll() 交互的关键。
· OnScroll() —— OnHScroll() 和 OnVScroll两个消息处理函数都调用了这个函数。根据页面大小和行大小确定要滚动的量。再调用 OnScrollBy()
· OnScrollBy() —— 检查需要滚动的量是否超出了滚动条的范围和视图的逻辑大小。若没有,调用 ::SetScrollPos() 移动滚动条,在调用 ::ScrollWindow().
· OnSize() —— 若 CScrollView 不是处于“scale-to-fit”模式下,OnSize() 调用 UpdateBars();否则,调用 SetScaleToFitSize()。
· OnHScroll() —— 调用 OnScroll() 的消息处理函数。
· OnVScroll() —— 调用 OnScroll() 的消息处理函数。
CScrollView::SetScrollSizes() (VIEWSCRL.cpp) 《深入解析MFC》P239
①. 将 m_nMapMode 初始化为提供的新映射模式, m_totalLog 的初始化值是sizeTotal 参数。
②. 在栈上创建一个 CWindowDC,并且在设置了映射模式之后,使用DC 来计算视图大小、页面大小和行大小的设备坐标。
③. 将逻辑坐标转化为设备坐标后,检查确保用户提供了一个非默认的值,若为默认值0,页面大小设为视图大小的1/10,行为页的1/10或视图的1/100。
④. 若需要,调用 UpdateBars() 和 Invalidate()。设置滚动条,若修改了映射模式,重画。
CScrollView::OnPrepareDC() 在调用 OnDraw()之前调用
①. 设置映射模式,若在“scale-to-fit”模式下,模式设置为 ANISOTROPIC,然后对窗口和视图端口操作,知道视图的大小和客户窗口匹配。
若不是,调用 SetMapMode(), 参数是用户通过 SetScrollSizes() 指定的映射模式。
②. 在栈上创建一个 CPoint ptVpOrg(assume no shift for printing),初始化为 0,0。 若视图不在打印, ptVpOrg = -GetDeviceScrollPosition()
③. 调用 CDC::SetViewportOrg( ptVpOrg )。然后调用 CView::OnPrepareDC()。
-------------------------------------
CFormView
先用资源编辑器创建一个对话框模板,然后创建一个CFormView 的派生类,然后将它和对话框模板绑定(通过将模板的资源ID 传递给 CFormView 构造函数)
(VIEWFORM.CPP) 《深入解析MFC》 P242
· m_lpszTemplateName —— 对话框模板资源的名字
· m_pCreateContext —— 指向 CCreateContext 的指针。CFormView不直接使用,会再 OnCreate() 函数中将它传送给框架。
· m_hWndFocus —— 在 OnSetFocus() 中,CFormView将焦点设置为窗口句柄, OnActivateView(),OnActivateFrame()。
· OnDraw() —— 什么都不做,Windows控件都会重画自己。
· PreTranslateMessage() —— 完成一些路由的任务,将控件、视图和窗口的消息送往正确的目的地
· SaveFocusControl() —— 将 m_hWndFocus 设置为 ::GetFocus() 的返回结果,即当前处于焦点的控件。
· OnActivateFrame() —— 当视图被禁用时,调用 SaveFocusControl() 确保当焦点回来是,焦点的控件仍有控制。
· OnActivateView —— 设置 m_hWndFocus 变量
· OnCreate() —— 将m_pCreateContext 传递给 LPCREATESTRUCT 结构指针的 lpCreateParams 域。
· OnSetFocus() —— 若 m_hWndFocus 指向一个合法窗口,OnSetFocus()会将焦点设为这个控件。否则将焦点设为源窗口。
CFormView::Create()
①. 在m_pCreateContext 中存储 CCreateContext 参数,这样就可以再调用 OnCreate() 时传入。然后确保 Windows通用控件都是注册过的。
②. 调用PreCreateWindow 来确定用户指定的扩展风格,在调用 CWnd::CreateDlg()。这个函数从应用程序的资源中装载对话框模板,
并调用CWnd::CreateDlgIndirect()。CreateDlg() 创建一个非模态的对话框。
③. 将m_pCreateContext 设置为 NULL,再修改窗口的标准风格和扩展风格。将窗口控件的标示符设置为 nID 参数。
再调用 SetScrollSizes() 来初始化 ScrollView,采用的映射模式为 MM_TEXT。就创建了一个和对话框模板一样大的逻辑视图。
④. 将视图的大小和 rect 参数的值匹配,再在 PreCreateWindow() 中调用指定了 WS_VISIBLE,就调用 ShowWindow()。
CFormView::OnInitialUpdate()调用了 UpdateData(FALSE) 来初始化窗体中的控件。 DDX/DDV就认为CFormView是一个对话框。
--------------------------------
CCtrlView 《深入解析MFC》 P244
CCtrlView 派生以下类: CEditView、CListView、CTreeView、CRichEditView
· m_strClass —— 包含了控件的窗口类的名字,通常是“viewized”。在构造函数中设置。
· m_dwDefaultStyle —— 视图类的默认风格。通过构造函数传入。
· OnDraw() —— 从不被调用,调用了 ASSERT(FALSE)来确保不被调用。
· PreCreateWindow() —— 设置CREATESTRUCT 的 lpszClass 域,设置成 m_strClass 成员数据,这样就创建了控件。
还对 CREATESTRUCT 的风格域操作,以反映存储在 m_dwDefaultStyle 中的值。
· OnPaint() —— 调用 Default()。Default() 会将前一个消息(WM_PAINT)发送给DefWindowProc()。
CTreeView (VIEWCMN.CPP,AFXCVIEW.INL)
· GetTreeCtrl() —— 返回一个 CTreeCtrl 引用,类的使用者可以用这个引用直接调用 CTreeCtrl,对树控件操作。
· RemoveImageList() —— 一个内部辅助函数,将控件的图像链表清空。这个辅助函数会再 OnDestroy() 中被调用
· OnDestroy() —— 清空 LSVIL_NORMAL 和 LVSIL_STATE 两个图像链表,调用 RemoveImageList()。
posted on 2010-03-15 23:25
Euan 阅读(2177)
评论(0) 编辑 收藏 引用 所属分类:
windows