分享

深度思索与实践一:vs2010拆分窗口

 牛人的尾巴 2017-01-16
文/老闫
一 关于分割窗口的分割器

 CSplitterWnd类

       MFC中的分割窗口类-CSplitterWnd类封装分割器窗口的所有功能。分割器窗口指含有多个窗格的窗口,多窗口可以容纳相同的视图或不同的视图。

      1.构造对象

     CSplitterWnd类首先构造对象,在VS2010软件自动搭建的构架内部,分拆窗口的实现在CMainFrame主框架中实现,在主框架的类的定义中定义一个公有(public) CSplitterWnd对象,供BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)函数调用,实现窗口分拆的目的。

      2.静态创建与动态创建

       动态创建函数CSplitterWnd类有一个Create()函数,用于创建动态分割器窗口并将该窗口链接到CSplitterWnd类对象。

       静态创建函数CSplitterWnd类有一个CreateStatic()函数,用于创建动态分割器窗口并将该窗口链接到CSplitterWnd类对象。

  1.   动态创建调用
    1.  virtual BOOL Create(   
    2.    CWnd* pParentWnd,   //指向该分离器窗口的父框架窗口的指针,如在主框架窗口内可用this;
    3.    int nMaxRows,   // 该分离器窗口的最大行数,该值不得大于2;
    4.    int nMaxCols,   //该分离器窗口的最大列数,该值不得大于2;
    5.    SIZE sizeMin,   //提示显示一个窗格所需的最小大小。
    6.    CCreateContext* pContext,  //   指向一个CCreateContext结构的指针
    7.    DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,   //指定窗口的风格
    8.    UINT nID = AFX_IDW_PANE_FIRST   //窗口子窗口ID该 
    9. );  

静态创建调用
    1. virtual BOOL CreateStatic(   
    2.    CWnd* pParentWnd,   
    3.    int nRows,   //不能超过16
    4.    int nCols,   //不能超过16
    5.    DWORD dwStyle = WS_CHILD | WS_VISIBLE,   
    6.    UINT nID = AFX_IDW_PANE_FIRST    
    7. ); 
  1.      返回值:成功返回非0;不成功返回0;

  2.     3.  创建静态分割窗口的步骤为:
  3.        
  4.       1) VS2010生成单文档/视构架,并选择添加不同分割窗口内的视图。

      2)在父框架类中定义一个CSplitterWnd类型的成员对象。

      3)重载父框架类的CFrameWnd::OnCreateClient成员函数。

      4)在重载的CFrameWnd::OnCreateClient函数中调用CSplitterWnd成员对象的Create函数。

案例代码:     注:这里m_splitterwnd为 CSplitterWnd类对象。
// CMainFrame 消息处理程序 处理分拆窗口
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
         // TODO: 在此添加专用代码和/或调用基类
        m_splitterwnd.CreateStatic(this,1,2);//拆分静态窗口为一行两列
        m_splitterwnd.CreateView(0,0,RUNTIME_CLASS(CMyDaohangView),CSize(250,100),pContext);
        m_splitterwnd.CreateView(0,1,RUNTIME_CLASS(CoilpumpspecialistView),CSize(100,100),pContext);
return TRUE;

}

二 关于分拆窗口中的视构建

1)客户区概念

a)先学习一下OnCreateClient这个函数:

CFrameWnd::OnCreateClient调用由框架在 OnCreate时的执行。

语法

   virtual BOOL OnCreateClient(

   LPCREATESTRUCT lpcs,

   CCreateContext* pContext );

参数:

lpcs

对于Windows CREATESTRUCT 结构的指针。

pContext

为 CCreateContext 结构的指针。

返回值:如果成功,非零;否则为0。

备注:

不要调用此函数。

此函数的尽可能默认实现在 pContext创建从已提供的信息 CView 对象。

重写此函数重写在 CCreateContext 对象传递的值或更改方法控制在框架窗口的主要客户端区域中创建。 您可以重写的 CCreateContext 成员。CCreateContext 选件类所述。

System_CAPS_note注意

不要替换在 CREATESTRUCT 结构中传递的值。 它们仅适用于信息性使用。 例如,如果要重写初始窗口矩形重写 CWnd 成员函数 PreCreateWindow。

要求:头文件位置: afxwin.h,请参阅CFrameWnd Class层次结构图

2) 理解客户区

     客户区分为窗口框架客户区和视图客户区,窗口框架客户区包容视图;框架客户区以外为框架非客户区。这里为框架客户区,在这个客户区里可以构建视图窗口,视图视(窗口)内包含视图客户区,这里不讨论。

     在框架客户区内部构造分拆器,说明一个根本的目的就是要分拆框架窗口的客户区,让不同的视放入不同的框架客户区内部。

三)建立视

1)让我们看看嵌入OnCreateClient()中的下面代码:

   m_splitterwnd.CreateView(0,0,RUNTIME_CLASS(CMyDaohangView),CSize(250,100),pContext);

调用了如下构建函数:

  1.         virtual BOOL CreateView(   
  2.            int row,   //新视图在分割器窗口的行
  3.            int col,   //指定新视图在分割器窗口的列
  4.            CRuntimeClass* pViewClass,   //新视图的CRuntimeClass类即运行的视图类
  5.             SIZE sizeInit,   //新视图的初始大小值
  6.           CCreateContext* pContext    //指向用于创建此视图的创建描述表的指针
  7.            );  
2)CCreateContext 结构
这里我对CRuntimeClass* pViewClass类产生的指针很感兴趣,研究了一下如下:

CCreateContext Structure

查阅微软资料如下
框架使用 CCreateContext 结构,在创建与文档框架窗口和视图时。

struct CCreateContext  

CCreateContext 是结构,并没有基类。

在创建窗口时,此结构的值中的信息连接文档的元素到其数据视图。 如果重写创建过程中,您只需 CCreateContext

CCreateContext 结构包含指向文档、框架窗口、视图和文档模板。 它还包含标识视图的类型创建的指向 CRuntimeClass。 运行时选件类信息和当前文件指针使用动态创建新视图。 下表建议如何以及何时可以使用每个 CCreateContext 成员:

成员类型将针对
m_pNewViewClassCRuntimeClass*创建的新视图的CRuntimeClass
m_pCurrentDocCDocument*现有文档与新的视图。
m_pNewDocTemplateCDocTemplate*文档模板与新的MDI框架窗口的创建。
m_pLastViewCView*附加视图进行建模的原始视图中,在拆分窗口视图中创建或第二个视图的创建文档中的。
m_pCurrentFrameCFrameWnd*其他框架窗口进行建模的框架窗口,在第二个框架窗口中创建文档中的。

当文档模板创建文档及其关联的元素时,它将验证 CCreateContext 结构中存储的信息。 例如,不应使用不存在创建视图文档。

System_CAPS_ICON_note.jpg 说明

所有在 CCreateContext 的指针是可选的,可以为 NULL,如果未指定或未知。

功能下面列出的“并查看的成员使用CCreateContext ”。如果您计划中重写这些属性,请参考这些函数的声明特定的信息。

这是一些通用准则:

  • 当通过,因为windows创建的参数,在 CWnd::CreateCFrameWnd::Create和 CFrameWnd::LoadFrame,创建上下文指定应连接的窗口。 对于大多数窗口,整个结构是可选的,并且 NULL 指针可以通过。

  • 对于可重写的成员函数,例如 CFrameWnd::OnCreateClientCCreateContext 参数是可选的。

  • 对于视图创建涉及的成员函数时,必须提供足够的信息来创建视图。 例如,在拆分窗口的第一个视图,必须提供视图选件类信息,并且当前文件。

通常,因此,如果使用框架默认,您可以忽略 CCreateContext。 如果尝试更高级的修改,Microsoft基础类库选件源代码或示例程序,例如VIEWEX中,将引导您完成。 如果忘记一个必选参数,结构断言将告知您要忘记了。

有关 CCreateContext的更多信息,请参见MFC示例 VIEWEX

要求 标头: afxext.h

3)理解pContext

当我把

 m_splitterwnd.CreateView(0,0,RUNTIME_CLASS(CMyDaohangView),CSize(250,100),pContext);里pContext指针设定为NULL编译不能通过,这个指针用于CreateView时指向创建描述表,这里可以检查RUNTIME_CLASS(CMyDaohangView)是否建立,则CreateView返回布尔类型校验框架客户区的视创建成功与否。

四)拆分窗口框架内部类之间通信


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多