摘要 本文以MFC(Microsoft Foundation Class Library)的CsplitterWnd类别为基础,通过对单文档视窗的静态分裂原理进行分析,介绍混合静态分裂视窗的实现方法,并深入阐述子视窗的视图动态切换技术。
关键词 静态分裂视窗 动态切换视图 混合分裂视窗
前言
在许多视窗应用软件中,通常要在屏幕上同时显示若干个子视窗,以显示同一个文档的不同部分,或者是在每个视窗中分别显示不同文档的内容。为了实现多视窗界面,可以采用MDI(Multiple Document Interface)的多文档模式进行处理,但是多文档的应用程序设计与维护相对于单文档的应用程序而言比较复杂。而且,如果要在屏幕上同时显示多个子视窗,通常要利用视窗重叠函数进行管理,每个子视窗的位置往往需要用鼠标人为设定,过多的人为干预降低了程序使用的效率。因此,如果能对单文档视窗做适当的分裂,无疑程序使用者将可以得到更易于操作的接口,数据的显示也更加直观和方便。本文通过对单文档视窗的静态分裂原理进行分析,实现上述要求。
二分裂视窗的类型
视窗的分裂可分为两种类型,一是动态分裂,二是静态分裂。动态分裂可以让使用者通过拖曳分裂方块的使用,将视窗分裂。但是,动态分裂最多只可以将视窗分裂为2×2个子视窗,不能进行混合分裂视窗,所有子视窗的属性和父视窗都是一样的,而且子视窗的数据通常来源于同一处。而静态分裂,使用者除了可以调整子视窗的大小和进行混合分裂视窗外,最多可将视窗分裂为16×16个子视窗,每个子视窗可以有各自不同的视图类(CView),各个子视窗显示的数据可以来自于不同的数据源。不论是要创建动态分裂视窗还是静态分裂视窗,都必须要利用MFC的CSplitterWnd类别来完成视窗的分裂。
混合静态分裂视窗的实现
混合分裂视窗是指在子视窗中进行视窗的再分裂。在MFC的框架下,混合分裂视窗必须完成三件工作:
⑴在视窗框架类别中定义CSplitterWnd控件为其属性(数据成员)。
⑵重载视窗框架类别中的OnCreateClient函数(CFrameWnd::OnCreateClient),建立静态分裂子视窗,为静态分裂子视窗填充视图。
⑶建立维持各子视窗同步更新的机制。
首先,利用MFC AppWizard生成一个单文档应用程序,在应用程序的CMainFrame类别中声明CSplitterWnd类别的数据成员。
其次,重载CMainFrame类别中的OnCreateClient(LPCREATESTRUCT,CCreateContext* pContext)函数。在该函数中利用CsplitterWnd类别的构造函数Create Static(CWnd *pParentWnd,int nRows,int nCols,DWORD dwstyle,UINT nID) 创建混合静态分裂子视窗,即在Create Static分裂出的子视窗中利用CsplitterWnd类别的控件再一次分裂视窗。
Create Static函数的参数含义为:
·pParentWnd是准备建立静态分裂视窗的视窗框架控件的指针;
·nRows和nCols是准备建立静态分裂视窗行数(nRows)与列数(nCols)
因此,创建的静态分裂子视窗个数为nRows × nCols个,这两个参数最小不得小于0,最大不可超过16;dwstyle是设定子视窗的形式;nID静态分裂的代号(ID),此代号预设为AFX_IDW_PANE_FIRST,若静态分裂视窗位于另一个分裂视窗内时,不可以使用默认值,可以利用CsplitterWnd类别的成员函数IdFromRowCol(int row,int col)获得。利用CsplitterWnd类别的成员函数Create View (int row,int col,CruntimeClass* pViewClass,SIZE sizeinit,CcreateContext* pContext) 为静态分裂子视窗填充视图,在将视图与子视窗关联时必须先完成子视窗的创建。
Create View函数的参数含义为:
·row和col是指定准备建立View控件的子视窗,其指定的方式是以表示该子视窗所在的行列位置;
·pViewClass是指定用于建立子视窗View控件的View类别,该类别需要被声明为Run-Time类别;
·Sizeini是View控件的起始大小;pContext是一个指向记录应用程序所使用的视窗框架控件、Document控件,以及View控件之变量的指针,此参数在CMainFrame::OnCreateClient函数被调用时传入,再由该函数传递给此函数。
·CsplitterWnd类别的成员函数SetColumnInfo(int col,int cxIdeal,int cxMin)和SetRowInfo(int row,int cyIdeal,cyMin)为设置子视窗的宽度和高度,参数cxIdeal和cxMin是指定子视窗的宽度和最小宽度,cyIdeal和cyMin是指定子视窗的高度和最小高度,在使用这两个函数调整子视窗的大小后还应该使用该类别的成员函数RecalLayout()重新调整视窗框架的布局。如果要设定视窗框架里的活动子视窗,可以通过CsplitterWnd类别的成员函数SetActivePane(int row,int col,CWnd* pWnd=NULL)来完成,该函数指定子视窗的方式有两种,一是指出子视窗所在的行列,二是传入指向该子视窗的控件指针。
最后,将视窗分裂成多个子视窗后,整个视窗程序中将存在多个View控件。当在其中一个View控件执行更新操作时,如何让其它View控件同步更新数据?可以通过文档类别(CDocument)的UpdateAllViews(CView* pSender,LPARAM lHint,CObject* pHint)成员函数的调用,再由该函数分别调用目前存在于视窗程序中各View控件的On Update函数来完成数据的同步更新。
UpdateAllViews函数的参数含义为:
·pSender是指向引发更新操作的View控件指针,如果传入NULL表示所有视图都要执行更新操作;
·lHint是用于传送更新视图时,需要传送的额外信息参数;
·pHint是指向记录更新视图所需额外信息的控件。在调用该函数时,将View控件的指针传入的目的是要告诉该函数该子视图已经完成数据更新,该函数不需要再调用该子视图的On Update进行数据更新。
子视图的动态切换
在多视图应用程序中,可以通过改变CCreateContext对象的值,来创建更加灵活的视图,实现多视图的动态切换。CCreateContext是MFC框架所使用的一种数据结构,它将构成文档/视图结构的组件联系起来。这个结构包括指向文档的指针、视窗框架的指针、视图的指针以及文档模板的指针,它还包含一个指向CRuntimeClass结构的指针,以指明所创建的视图的类型。
其数据成员如下:
·m_pNewViewClass是指向创建上下文的视图的CRuntimeClass结构的指针;
·m_pNewDocTemplate是指向与视窗框架的创建相联系的文档模板的指针;
·m_pCurrentDoc是指向文档对象的指针,以和新视图联系起来;
·m_pLastView是指向已存在的视图的指针,它是新产生的视图的模型;
·m_pCurrentFrame是指向已存在的视窗框架的指针,它是新产生的视窗框架的模型。
此外,任何一个从CObject类别继承而来的子类别,在使用宏DECLARE_DYNAMIC、DECLARE_DYNCREATE、DECLARE_SERIAL三个中的任意一个时都会产生一个CRuntimeClass结构的静态对象,RUNTIME_CLASS返回的就是这个对象的指针,这个对象包含了其基类和本身在运行时刻的信息。
在单文档静态分裂视窗的应用程序中,利用CsplitterWnd类别的成员函数Delete View(int row,int col)可以删除子视窗的原有视图,然后再通过该类别的成员函数Create View为子视窗创建新的视图。但是,创建新视图前必须初始化创建上下文相关指针,即对CCreateContext结构赋值。值得注意的是,使用Create View函数创建的新视图不能自动调用视图类别的成员函数OnInitialUpdate和自动显示并且激活新视图,需要人工调用OnInitialUpdate函数和ShowWindow(SW_SHOW) 函数,这些函数的调用都可以通过CsplitterWnd类别的成员函数Get Pane(int row,int col)获得新视图的指针来完成。
结束语
在MFC的框架下,混合分裂视窗有多种编程方法,本文只是从CsplitterWnd类别的角度去分析混合静态分裂视窗的实现方法,希望能给读者起到抛砖引玉的作用。
分享到:
相关推荐
或者提供ID3标签编辑,允许你在分割后为每个新文件添加或更新元数据,如艺术家名、专辑名、曲目标题等。这有助于整理和管理你的音频库。 在保存新文件时,MP3SPLITTER可能会提供多种输出格式选项,虽然其名称中包含...
3. 输出质量:确保分割后的音频文件保持与原文件相同的音质,避免因转码导致音质下降。 4. 软件安全:作为“三无软件”(无广告、无推广、无病毒),AudioSplitter和MP3Splitter为用户提供了一个安全的环境,避免了...
- MP3 Joiner Pro: automatically free the source audio file while setting the output ID3 tag. - Fixed some minor bugs. Testimonials "...I am very satisfied with the product. It is very simple, and ...
MP3 Splitter & Joiner 是一款 MP3 文件分割与合并软件。它可以快速将单个 MP3 分割为多个文件或将多个 MP3 合并为单个文件。通过内置播放器,您可以在对 MP3 进行分割或合并前进行预览。软件支持多种 MP3 分割方式...
6. **其他特性**:除了基本的切割和合并功能,MP3 Splitter&Joiner Pro 还可能包含其他附加功能,如ID3标签编辑、预览选项、自定义输出设置等,这些都可以增强你的音频管理能力。 7. **应用领域**:这款工具广泛...
MP3 Splitter Joiner是一款专为音频爱好者设计的软件,主要功能是处理MP3格式的音频文件,允许用户根据需求进行分割和合并操作。在音乐制作、编辑或个人娱乐过程中,这款工具能提供极大的便利性。 一、MP3格式基础 ...
5. **保存元数据**:在分割过程中,MP3SPLITTER会保留原文件的ID3标签信息,如艺术家、专辑、曲目标题等,保持分割后的每个片段完整无缺。 6. **灵活的输出设置**:你可以选择在分割后是否保留原文件,或者直接覆盖...
Audio Recorder Platinum 4.21 build3 录音软件破解版到 http://download.csdn.net/source/2126214下载 mp3 Audio Converter 4.50 破解汉化版到 http://download.csdn.net/source/2123549下载 拷贝到安装目录执行. ...
《MP3 Splitter & Joiner Pro:音频处理的利器》 MP3 Splitter & Joiner Pro 是一款功能强大的音频编辑工具,专为处理MP3格式的音频文件而设计。这款软件以其无需安装、绿色小巧的特点深受用户喜爱,只需将压缩包...
MP3 Splitter&Joiner V3.03 Build 3是一款专为音频爱好者设计的实用工具,主要用于对MP3文件进行分割和合并操作。这款软件的绿色汉化版意味着它无需安装,用户可以直接运行,同时提供了简体中文界面,方便国内用户...
Gephi是一款强大的开源图形化网络分析和可视化软件,它被广泛用于社会网络分析、生物信息学、地理信息系统等领域。本教程将详细讲解如何利用Gephi进行数据导入、数据预处理、网络布局、节点和边的属性设置、以及最终...
SolveigMM Video Splitter是一款出色的视频分割剪切、视频合并软件,可以作为MPEG-2、AVI、WMV、ASF、MP3、WMA编辑器使用,是SolveigMM AVI Trimmer的功能加强版、分割合并快速无损、且界面友好。 SolveigMM Video ...
3、Direct WAV MP3 Splitter向用户提供了多项有趣的功能以及高质量的结果。如果你喜欢音频文件中的某个片段,想要裁剪下来,它是一个不错的选择。而且,软件还是创建铃声的好用具哦。 小提示:解压后运行install....
破解的是MP3 Splitter & Joiner Pro v5.10,32bit And 64bit版 1.请先安装原版 2.拷贝本补丁到安装目录(即Mp3matePro.exe所在目录) 3.执行补丁。 4.运行程序,点击注册--用户名随便写,注册码为 12345-678910-...
3. **预览与编辑**:在剪切或合并前,用户可以实时预览音频效果,确保每个部分都符合预期。此外,一些版本可能还支持简单的音频编辑功能,如调整音量、消除静音等。 4. **高速处理**:MP3Splitter通常采用高效的...
《Mp3Splitter:专业高效的MP3剪辑工具详解》 在数字音乐的世界里,MP3格式因其良好的压缩效率和广泛的设备支持,成为了最常见的音频格式之一。然而,有时我们需要对MP3文件进行精细化处理,例如分割长篇的录音、...
【ps3splitter-1-1-5-1】是一款专为PlayStation 3(简称PS3)系统设计的文件分割工具。这款软件的主要功能是帮助用户将大型的单个文件分割成更小的部分,以便在PS3的限制下进行传输和存储。在PS3系统中,由于内置...
3. 语言学习:学习外语时,可以利用MP3 Splitter & Joiner Pro V4.2将对话或例句切割成单独的音频片段,方便反复练习。 4. 影视配乐:在视频编辑中,有时需要定制特定长度的背景音乐,这款软件可以帮助快速裁剪出...
MP3 Splitter & Joiner Pro 是一款专为音频爱好者设计的专业工具,主要用于处理MP3格式的音频文件。这款软件的功能主要包括MP3文件的分割和合并,使得用户可以根据自己的需求对音乐进行个性化编辑。 在音乐分割方面...
MP3 Splitter & Joiner 是一款非常有用的 MP3 编辑软件,...本软件也支持对分割或合并的 MP3 文件的 ID3 标签进行编辑。如果你正在寻找能帮助你分割与合并 MP3 的程序,那么 MP3 Splitter & Joiner 就不会让你失望。