分类
用Visual C++中实现混合分割视图‖
处理前和处理后的图像信息
能,可以采用MDI的多文档
而言相对复杂,而且如果要
的位置也往往需要用鼠标人
些应用程序,如果能够用分
,显示更加直观和方便。
,或者在每个窗口中分别显示图
模式进行处理,但是多文档的程
在屏幕上同时显示窗口,通常要
为设定,过多的人为干预也降低
割视图来实现屏幕绘图和显示,
像的细节和概貌。为了实现上述功
序设计和维护相对单文档应用程序
调用窗口重叠函数进行管理,窗口
了程序使用的效率。因此,对于某
无疑会降低程序使用者的操作强度
| ”疚慕樯芰艘恢只旌戏?br>普通视图和基于CFormView 里面又包含视窗,如图所示 | 割视图的实现方法,即在Visual 类的窗体视图,且视图之间存在 为要涉设计的界面形式。 | C++中,同时出现基于CView类的 着二次(或多次)再分割,即视窗 |
![]() |
| 界面内共含有一个框架 窗 Info。视窗Left、 Righ 这几个视窗的基类都是CVie 示系统的当前信息和工作进 | 和五个视窗,视窗Left、视窗Ri t和 Zoom分别显示左右图像窗口 w;视窗Control用来 进行仪器 程和状态,这两个视窗都从CFor | ght、视窗Zoom、视窗Control和视 的图像和经过高倍放大后的图像, 控制和图像操作,视窗Info用来显 mView派生出来。 |
| 为了实现上述功能,首先用AppWizar 为CZoomView,用来显放大的图像。 | d生成一单文档应用程序,并自定义生成的默认视类 |
| 接下来,通过如下步骤,创建另外四个视窗: |
| 1、用ClassWizard为应用程序创建一 在该类中将所有CMDIChildWnd的地方替换 CsplitterWnd类派生子类); | 个新类CFixedSplitter,基类为CMDIChildWnd,然后 为CsplitterWnd(因为ClassWizard不支持直接从 |
| 2、在CMainFrame类里声明分割视图的变量: |
| CFixedSplitter Split | terH1; file://水平分割视窗1 |
| CFixedSplitter SplitterH2; file: | //水平分割视窗2 |
| CFixedSplitter SplitterV; file://垂直分割视窗 |
| 3、用ClassWizard为应 ,CControlView和CinfoVie 应的对话框资源;注意这里 WS_CHILD=On,WS_BORDER=O 见的子窗口,如果这项工作 ; | 用程序添加四个新类,其中CLef w从CFormView类中派生;用资源 一定要通过交互操作将两对话框 ff,WS_VISIBLE=Off,WS_CAPTI 没有作,编译时虽然能够通过, | tView和CrightView从Cview类派生 管理器为两个CFormView类指定相 的风格(属性)设置为 ON=Off,即无标题、无边框、不可 但运行时将会出现断言ASSERT错误 |
| 4、在CMainFrame类的O | nCreateClient函数中添加代码 | ,创建分割视图 |
| BOOL CMainFrame::OnC | reateClient(LPCREATESTRUCT l | pcs, CCreateContext* pContext) |
| { |
| // TODO: Add your specialized co | de here and/or call the base class |
| BOOL rtn=SplitterV.CreateStatic( 列; | this,1,2); file://首先将窗口客户区分割为一行两 |
| file://将左客户区再分割为三行一列,并以上面分割的左视窗作为父窗口; |
| SplitterH1.CreateSta | tic(&SplitterV, 3, 1, WS_CHI | LD | WS_VISIBLE | WS_BORDER, |
| SplitterV.IdFromRowCol(0,0)); |
| file://将右客户区再分割为两行一列,并以上面分割的右视窗作为父窗口; |
| SplitterH2.CreateSta | tic(&SplitterV, 2, 1, WS_CHI | LD | WS_VISIBLE | WS_BORDER, |
| SplitterV.IdFromRowCol(0,1)); |
| file://创建各自视图,并调用RUNTI | ME_CLASS运行库指定各视图的管理类 |
| SplitterH1.CreateVie | w(0, 0, RUNTIME_CLASS(CViewL | ), CSize(0, 0), pContext); |
| SplitterH1.CreateVie | w(1, 0, RUNTIME_CLASS(CViewR | ), CSize(0, 0), pContext); |
| SplitterH1.CreateView(2, 0, RUNT ; | IME_CLASS(CControlView), CSize(0,0), pContext) |
| SplitterH2.CreateVie | w(0, 0, RUNTIME_CLASS(CZoomV | iew), CSize(0, 0), pContext); |
| SplitterH2.CreateView(1, 0, RUNT | IME_CLASS(CInfoView), CSize(0, 0), pContext); |
| file://设置水平和垂直分割条的初始位置 |
| SplitterV.SetColumnI | nfo(0,Ver_Sp_Pos,0); file:// | Ver_Sp_Pos为预定分割条的位置 |
| SplitterH1.SetRowInf | o(0,Hor_Sp_Pos,0); file://Ho | r_Sp_Pos为预定分割条的位置 |
| SplitterH1.SetRowInfo(1,Hor_Sp_Pos,0); |
| SplitterH2.SetRowInfo(0,576,0); |
| return rtn; |
| file://return CFrameWnd::OnCreat 则视图无法显示; | eClient(lpcs, pContext); file://覆盖此函数,否 |
| } |
| 这样编译运行后,程序 的形状将会发生变化,呈现 位置将随鼠标的移动发生变 作: | 的界面基本上就有了模样。但是 出拖动状态的图标,当按下鼠标 化。如果程序需要禁止分割条的 | 当鼠标移动到分割条位置始,鼠标 左键并进行拖动操作时,分割条的 移动操作,那么还需要继续以下操 |
| 在CfixedSplitteWnd类中重载以下函数,以禁止鼠标拖动和光标变化: |
| void CFixedSplitterWnd::OnLButto | nDown(UINT nFlags, CPoint point) |
| { |
| CWnd::OnLButtonDown(nFlags, poin | t); file://最后修改成CWnd的函数 |
| file://CSplitterWnd: | :OnLButtonDown(nFlags, point | ); file://替换默认的函数 |
| } |
| BOOL CFixedSplitterW | nd::OnSetCursor(CWnd* pWnd, | UINT nHitTest, UINT message) |
| { |
| return CWnd::OnSetCursor(pWnd, n | HitTest, message); |
| file://return CSplitterWnd::OnSe | tCursor(pWnd, nHitTest, message); |
| } |
| void CFixedSplitterW | nd::OnMouseMove(UINT nFlags, | CPoint point) |
| { |
| CWnd::OnMouseMove(nFlags, point); |
| file://CSplitterWnd: | :OnMouseMove(nFlags, point); |
| } |
| 接下来就可以象在多文 自的文档内容,非常方便。 倍放大的细节图像。通过在 果用动画等形式显示在信息 | 档重叠窗口一样,管理自己的各 程序中创建了两个小的窗口显示 控制窗体中进行操作,协调各视 窗体中。 | 自视图,每个视图可以分别显示各 概貌图像,并用一个大窗口显示高 图的工作进程,并将当前的运行结 |
