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

2009-9-8

========================================================
《深入解析MFC》笔记 9.MFC的增强型用户界面类
========================================================

----------------------------
CSplitterWnd: MFC分割窗口         《深入解析MFC》P249

    使用 CSplitterWnd
        创建动态分割窗口
        ① 在子框架的派生类中加上一个 CSplitterWnd 数据成员。
        ② 在CMyChildFrame::OnCreateClient() 处理程序,添加对 CSplitterWnd::Create() 的调用。
            Create() 的第一个参数指向父框架的指针,第二个和第三个分别指定了最大行数和最大列数。
                            第四个参数指定了所允许的最小窗格大小,第五个参数指向 CCreateContext 的指针。
        ③ 将框架窗口的 RUNTIME_CLASS 消息传递给 CDocTemplate 构造函数:
            CMultiDocTemplate* pDocTemplate =
                new CMultiDocTemplate( IDR_MYAPPTYPE, RUNTIME_CLASS(CMyDocClass ), RUNTIME_CLASS( CMyChildFrameClass ),
                                  RUNTIME_CLASS(CMyViewClass));
            AddDocTemplate(pDocTemplate);

        创建静态分割窗口,用 CreateStatic() 代替 Create()。调用CSplitterWnd::CreateView() 来创建新的窗格。
       
 *************************      
    CSplitterWnd 内部实现
   
    封装的数据类型
        · ESplitType —— 定义要画出的分割器的类型,属于枚举类型。类型有 分割框、分割条、分割焦点以及分割边界。
        · CRowColInfo —— 记录行或列的最小尺寸、理想尺寸和当前尺寸。
    创建/布局数据成员
        · m_pDynamicViewClass —— 指向由 CSplitterWnd 动态创建的视图(窗格)的CRuntimeClass 信息的指针。Create() 或CreateView()中定义
        · m_nMaxRows / m_nMaxCols —— 调用 Create() 和 CreateStatic() 时制定的最大行数和列数。
        · m_nRows / m_nCols —— 当前在 CSplitterWnd 里显示的行数和列数。
        · m_bHasHScroll / m_bHasVScroll —— 表明行滚动条或列滚动条 是否已经创建的标记。
        · m_pColInfo —— 是CRowInfo的数组,每个元素对应 CSplitterWnd 的一列。静态分割中,这个值固定。
        · m_pRowInfo —— 是 CRowColInfo 的数组,每个元素对应CSplitterWnd 的一行。
    修饰的数据成员
        在构造函数中初始化,
        · m_cxSplitte / m_cySplitter —— 分割框和分割器的宽度和高度。
        · m_cxBorderShare / m_cyBorderShare —— 如果分割窗口正在画分割窗口的边界,值为1.
        · m_cxSplitterGap / m_cySplitterGap —— 分割框/分割条和滚动条/边界之间的距离。值为6.
        · m_cxBorder / m_cyBorder —— 分割边界的边界宽度。值为0.
    跟踪数据成员
        用于点击测试和跟踪
        · m_bTracking —— 如果为真,则用户正在拖动一个分割条。
        · m_bTracking2 —— 如果为真,用户正在拖动两个分割条。
        · m_ptTrackOffset —— 点击测试中的“选取”尺寸。允许用户有所偏差。
        · m_rectLimit —— 跟踪时窗格的大小,用来确定被跟踪的分割条的高度。
        · m_rectTracker —— 跟踪时用来画分割条的矩形。
        · m_rectTracker2 —— 跟踪时用来画第二个分割条的矩形
        · m_htTrack —— 被 CSplitterWnd 的点击跟踪机制设置成一个枚举值,用来描述分割窗口的哪个部分被点击了。
    通用成员函数
        · CreateCommon() —— 当Create() 和 CreateStatic() 初始化完 CSplitterWnd 的动态成员或静态成员时会调用这个函数。
        · CreateScrollBarCtrl() —— 创建带有指定风格和标示符的滚动条。
        · DoScroll() —— 对滚动条消息作出反应。 DoScroll() 能够同步适当的窗格。
        · DoScrollBy() —— 以制定的数量滚动相应的窗格。
        · DoKeyboardSplit() —— 在程序里调用该函数会使得窗口被分割。
        · CanActivateNext() —— 用来确定下一个窗格是否能被激活。即是否能得到焦点,被CView类调用
        · ActivateNext() —— 激活下一个窗格。通常在一个窗格被删除时调用
    布局成员函数
        · RecalcLayout() —— 维护所有分割窗口的位置,当一个窗格被创建/删除时,被调用。
        · TrackRowSize() —— 更新指定行的 m_pRowInfo 数组信息。同时确定是否有足够的空间来存储该行。
        · TrackColumnSize() ——
        · GetSizingParent() —— 搜索大小可变的父窗口
    绘画成员函数
        · DrawAllSplitBars() —— “驱动”分割窗口的绘画进程,为每个需要绘画的组件调用 OnDrawSplitter.
        · OnDrawSplitter() —— 为分割窗口的每个组件进行绘画,为虚函数。
        · OnPaint() —— 对WM_PAINT消息作出响应
    点击测试成员函数
        · HitTest() —— 选取某个点,返回这个点的点击测试值。
        · GetInsideRect() —— 类同GetClientRect(),考虑了共享的滚动条。
        · GetHitRect() —— 为某一指定的分割窗口组件检索点击矩形。
        · SetSplitCursor() —— 使用点击测试来确定要显示哪一种光标。
    跟踪成员函数
        · OnNcCreate() —— CSplitterWnd 处理WM_NCCREATE 消息,所以它可以移走 WS_EX_CLIENTEDGE 的扩展风格位。
        · OnPaint() —— 画分割窗口的各个组件。
        · OnDisplayChange() —— 当用户改变显示器的分辨率时背调用,调用RecalcLayout() 来更新分割窗口。
        · OnSize() —— 当用户改变窗口大小时 调用 RecalcLayout()。
        · OnMouseMove() —— 在分割窗口组件上执行点击测试。
**************************
    CSplitteWnd 的初始化
        CSPlitterWnd::CreateCommon()
            ① 调整好风格标记。
            ② 调用 AfxDeferRegisterClass(),CWnd::CreateEx()。
            ③ 为 m_pColInfo 和 m_pRowInfo 数组分配空间,并进行初始化,将 m_nMaxCols/Rows 作为数组的大小。
                CreateCommon() 在循环里一次访问CRowColInfo数组,做如下操作
                    1. nMinSize 和 nIdealSize 都被设置成参数 sizeMin的值。
                    2. nCurSize 被初始化为 -1,说明当窗格的尺寸被初始化(RecalcLayout)时,该值应该被设置。
            ④ 初始化完CrowColInfo 的行列数组后,调用 SetScrollStyle() 将 m_bHasH/VScroll 进行初始化,然后返回TRUE
     
        CSplitterWnd::CreateView()
            ① 将sizeInit参数存储在 CRowColInfo相应的数组下标里,设置一个局部标记 bSendInitialUpdate 值为FALSE。
            ② 创建一个局部的CCreateContext(),尽量将每个元素初始化为比较完整的值。调用 GetActivePane() 来确定 m_pLastViewCView指针
                一旦CreateView() 有了m_pLastView,就可以通过调用 GetDocument() 来确定 CCreateContext 其他域的值,
                然后调用 CDocument::GetDocTemplate()。在找到所有这些元素后,pContext指向她们,将bSendInitialUpadte设为 TRUE。
            ③ 调用 CreateObject() 为 CRuntimeClass 信息创建一个窗格对象。设置要传递到 Create() 的参数 风格和定位矩形。
           

 

 

 

posted on 2010-03-15 23:26 Euan 阅读(1585) 评论(0)  编辑 收藏 引用 所属分类: windows

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