您的位置:首页 > 其它

在MFC中分割窗口

2012-04-16 20:08 162 查看
分割窗口分为两类:动态分割窗口和静态分割窗口。

动态分割窗口是指:用户可以动态的分割和除去分割窗口,分割窗口会创建和删除相应的窗格。Microsoft Word就是使用动态分割窗口的例子,这是一种最常用的分割窗口。动态分割窗口最多可以有2行´ 2列个窗格。

静态分割窗口是指:在窗口创建时,分割窗口的窗格就已经创建好了,且窗格的数量和顺序不会改变。窗格为一个分割条所分割,用户可以拖动分割条调整相应的窗格的大小。如图8-9,Visual Studio的图标编辑器就是静态分割窗口的例子。在编辑器的左边窗格,显示图标的缩微图像,在右边显示图标的编辑窗口,可以拖动中间的分割条调整两个窗格的大小。静态分割窗口最多可以有16行´ 16列的窗格。

一、关于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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: