随笔-19  评论-2  文章-0  trackbacks-0

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

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理