单文档静态分割窗口总结

来源:互联网 发布:下载外国软件 编辑:程序博客网 时间:2024/05/22 04:45

单文档静态分割窗口总结

一、关于CSplitterWnd类
***********************
CObject
 └CCmdTarget
    └CWnd
       └CSplitterWnd

***********************

CSplitterWnd类提供一个分隔器窗口的功能,分隔器窗口是一个包含有多个窗格的窗口。窗格通常是应用程序特定的由CView派生的对象,但它也可以是具有适当子窗口ID的任何CWnd对象。
 
***********************

 

CSplitterWnd类成员

/////////////////////////////////////////////////////////////////////////////////

 

构造
CSplitterWnd             构造一个CSplitterWnd对象 
Create                   创建一个动态的分隔器窗口并将它与一个CSplitterWnd对象连接 
CreateStatic             创建一个静态的分隔器窗口并将它与一个CSplitterWnd对象连接 
CreateView               在一个分隔器窗口中创建一个窗格 

 

/////////////////////////////////////////////////////////////////////////////////

 

操作符
GetRowCount              返回当前窗格行的计数值 
GetColumnCount           返回当前窗格列的计数值 
GetRowInfo               返回指定行的信息 
SetRowInfo               设置指定行的信息 
GetColumnInfo            返回指定列的信息 
SetColumnInfo            设置指定列的信息 
GetPane                  返回位于指定行和列处的窗格 
IsChildPane              确定窗口是否是此分隔器窗口的当前子窗格 
IdFromRowCol             返回位于指定行和列处的窗格的子窗口ID 
RecalcLayout             在调整行或列尺寸后调用此函数来重新显示该分隔器窗口 
GetScrollStyle           返回共享滚动条的风格 
SetScrollStyle           为分隔器窗口的共享滚动条指定新的滚动条风格 

 

/////////////////////////////////////////////////////////////////////////////////

 

可重载
OnDrawSplitter           绘制一个分隔器窗口的图像 
OnInvertTracker          绘制一个分隔器窗口的图像,使它具有与框架窗口相同的大小和形状 
CreateScrollBarCtrl      创建一个共享的滚动条控件 
DeleteView               从分隔器窗口中删除一个视图 
SplitRow                 表明一个框架窗口是否是水平分隔的 
SplitColumn              表明一个框架窗口是否是垂直分隔的 
DeleteRow                从分隔器窗口中删除一行 
DeleteColumn             从分隔器窗口中删除一列 
GetActivePane            根据焦点或框架中的活动视来确定活动窗格 
SetActivePane            在框架中设置一个活动窗格 
CanActivateNext          检查Next Pane或Previous Pane命令当前是否有效 
ActivateNext             执行Next Pane或Previous Pane命令 
DoKeyboardSplit          执行键盘分隔命令,通常是“Window Split” 
DoScroll                 执行分隔窗口的同步滚动 
DoScrollBy               将分隔窗口滚动给定的像素数 

 

/////////////////////////////////////////////////////////////////////////////////

 

CSplitterWnd::Create

BOOL Create( CWnd* pParentWnd,
             int nMaxRows,
             int nMaxCols,
             SIZE sizeMin,
             CCreateContext* pContext,
             DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,
             UINT nID = AFX_IDW_PANE_FIRST
           );

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

参数: pParentWnd 分隔器窗口的父框架窗口。 
nMaxRows 分隔器窗口中的最大行数。这个值不能超过2。 
nMaxCols 分隔器窗口中的最大列数。这个值不能超过2。 
sizeMin 指出显示一个窗格所需的最小尺寸。 
pContext 指向一个CCreateContext结构的指针。多数情况下,这个值可以是传递给父框架窗口的pContext。 
dwStyle 指定窗口的风格。 
nID 此窗口的子窗口ID。如果这个分隔器窗口不是嵌套在另一个分隔器窗口中的,则这个ID可以是AFX_IDW_PANE_FIRST。 

说明:
要创建一个动态分隔器窗口,应调用Create成员函数。
你可以通过如下步骤将一个CSplitterWnd嵌入一个CFrameWnd或CMDIChildWnd父对象: 1. 在父框架中嵌入一个CSplitterWnd成员变量。 
2. 重载父框架的CFrameWnd::OnCreateClient成员函数。 
3. 从重载的OnCreateClient中调用Create成员函数。 
当你从一个父框架内创建一个分隔器窗口时,将父框架的pContext参数传递给此分隔器窗口。否则,Create函数的pContext可以是NULL。
一个动态分隔器窗口的初始最小行高度和列宽度由sizeMin参数设置。这些最小值被用来确定窗格是否太小以至于不能将其完整地显示出来。
有关动态分隔器窗口的更多信息,参见“Visual C++程序员指南”中的文章“多文档类型,视,和框架窗口”中的“分隔器窗口”;“Visual C++联机文档”中的“TN029:分隔器窗口”;以及CSplitterWnd类概述。

 

/////////////////////////////////////////////////////////////////////////////////

 

CSplitterWnd::CreateStatic

BOOL CreateStatic( CWnd* pParentWnd,
                   int nRows,
                   int nCols,
                   DWORD dwStyle = WS_CHILD | WS_VISIBLE,
                   UINT nID = AFX_IDW_PANE_FIRST
                 );

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

参数: pParentWnd 分隔器窗口的父框架窗口。 
nRows 行数。这个值必须不超过16。 
nCols 列数。这个值必须不超过16。 
dwStyle 指定窗口的风格。 
nID 此窗口的子窗口ID。如果这个分隔器窗口不是嵌套在另一个分隔器窗口中的,则这个ID可以是AFX_IDW_PANE_FIRSH。 

说明:
要创建一个静态的分隔器窗口,应调用CReateStatic成员函数。
你可以通过如下步骤将一个CSplitterWnd嵌入一个CFrameWnd或CMDIChildWnd父对象: 1. 在父框架中嵌入一个CSplitterWnd成员变量。 
2. 重载父框架的CFrameWnd::OnCreateClient成员函数。 
3. 从重载的OnCreateClient中调用Create成员函数。 
一个静态的分隔器窗口包含了固定数目的窗格,这些窗格是不同类的。
当你创建一个静态分隔器窗口时,你必须同时创建它的所有窗格。CReateView成员函数通常就是用于这个目的,但你也可以创建其它非视类。
一个静态分隔器窗口的初始最小行高度和列高度是0。这些最小值用来确定窗格是否太小以至于不能将其完整地显示出来。
要给静态分隔器窗口添加滚动条,就应在dwStyle参数中指定WS_HSCROLL或WS_VSCROLL风格。
有关静态分隔器窗口的更多信息,参见“Visual C++程序员指南”中的文章“多文档类型,视,和框架窗口”中的“分隔器窗口”;“Visual C++联机文档”中的“TN029:分隔器窗口”;以及CSplitterWnd类概述。

 

/////////////////////////////////////////////////////////////////////////////////

 

CSplitterWnd::CreateView

virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );

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

参数: row 指定用来放置新视的分隔器窗口行。 
col 指定用来放置新视的分隔器窗口列。 
pViewClass 指定新视的CRuntimeClass。 
sizeInit 指定新视的初始尺寸。 
pContext 指向用来创建此视的创建环境的指针(通常,该pContext被传递给在其中创建此分隔器窗口的父框架的重载的OnCreateClient成员函数)。 

说明:
此成员函数用来为一个静态分隔器窗口创建窗格。一个静态分隔器窗口的所有窗格必须在框架显示这个分隔器之前被创建。
当一个动态分隔器的用户分隔一个窗格,行或列时,框架也调用这个成员函数来创建新的窗格。

 

/////////////////////////////////////////////////////////////////////////////////

 

二、创建静态分割窗口

实现步骤:

1、利用AppWizard创建一个单文档SDI应用程序,项目名为Test
     由AppWizard自动生成的类有:
       CAboutDlg
       CTestApp
       CTestDoc
       CTestView
       CMainFrame

2、添加新特视图类: CImageView, CResultView
     在类视图中右键点击test -> 添加 -> 类 -> MFC类

3、在框架窗口类CMainFrame中声明一个CsplitterWnd类的成员变量m_spliterwnd

4、在MainFrame.cpp中重载OnCreateClient函数
     在类视图中单击CMainFrame -> 在属性窗口中选择重写 -> 添加OnCreateClient
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
 // TODO: 在此添加专用代码和/或调用基类
 if(m_spliterwnd.CreateStatic(this,1, 2)==NULL)
 {return FALSE;}
 if (m_spliterwnd.CreateView(0, 0, RUNTIME_CLASS(CImageView), CSize(100, 100), pContext))
 {return FALSE;}
 if (m_spliterwnd.CreateView(0, 1, RUNTIME_CLASS(CResultView), CSize(100, 100), pContext))
 {return FALSE;}
 return TRUE;
 //return CFrameWndEx::OnCreateClient(lpcs, pContext);
}

5、在MainFrame.cpp中添加头文件
      #include "ImageView.h"
      #include "ResultView.h"

6、和文档类相连
     在OnDraw下修改
     CtestDoc* pDoc =(CtestDoc*)CImageView:: GetDocument();
     CtestDoc* pDoc =(CtestDoc*)CResultView:: GetDocument();