用Visual C++中实现混合分割视图
2008-11-13 19:31:39 来源:WEB开发网2、在CMainFrame类里声明分割视图的变量:
CFixedSplitter SplitterH1; file://水平分割视窗1
CFixedSplitter SplitterH2; file://水平分割视窗2
CFixedSplitter SplitterV; file://垂直分割视窗
3、用ClassWizard为应用程序添加四个新类,其中CLeftView和CrightView从Cview类派生,CControlView和CinfoView从CFormView类中派生;用资源管理器为两个CFormView类指定相应的对话框资源;注意这里一定要通过交互操作将两对话框的风格(属性)设置为WS_CHILD=On,WS_BORDER=Off,WS_VISIBLE=Off,WS_CAPTION=Off,即无标题、无边框、不可见的子窗口,如果这项工作没有作,编译时虽然能够通过,但运行时将会出现断言ASSERT错误;
4、在CMainFrame类的OnCreateClient函数中添加代码,创建分割视图
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
BOOL rtn=SplitterV.CreateStatic(this,1,2); file://首先将窗口客户区分割为一行两列;
file://将左客户区再分割为三行一列,并以上面分割的左视窗作为父窗口;
SplitterH1.CreateStatic(&SplitterV, 3, 1, WS_CHILD | WS_VISIBLE | WS_BORDER,
SplitterV.IdFromRowCol(0,0));
file://将右客户区再分割为两行一列,并以上面分割的右视窗作为父窗口;
SplitterH2.CreateStatic(&SplitterV, 2, 1, WS_CHILD | WS_VISIBLE | WS_BORDER,
SplitterV.IdFromRowCol(0,1));
file://创建各自视图,并调用RUNTIME_CLASS运行库指定各视图的管理类
SplitterH1.CreateView(0, 0, RUNTIME_CLASS(CViewL), CSize(0, 0), pContext);
SplitterH1.CreateView(1, 0, RUNTIME_CLASS(CViewR), CSize(0, 0), pContext);
SplitterH1.CreateView(2, 0, RUNTIME_CLASS(CControlView), CSize(0,0), pContext);
SplitterH2.CreateView(0, 0, RUNTIME_CLASS(CZoomView), CSize(0, 0), pContext);
SplitterH2.CreateView(1, 0, RUNTIME_CLASS(CInfoView), CSize(0, 0), pContext);
file://设置水平和垂直分割条的初始位置
SplitterV.SetColumnInfo(0,Ver_Sp_Pos,0); file://Ver_Sp_Pos为预定分割条的位置
SplitterH1.SetRowInfo(0,Hor_Sp_Pos,0); file://Hor_Sp_Pos为预定分割条的位置
SplitterH1.SetRowInfo(1,Hor_Sp_Pos,0);
SplitterH2.SetRowInfo(0,576,0);
return rtn;
file://return CFrameWnd::OnCreateClient(lpcs, pContext); file://覆盖此函数,否则视图无法显示;
}
这样编译运行后,程序的界面基本上就有了模样。但是当鼠标移动到分割条位置始,鼠标的形状将会发生变化,呈现出拖动状态的图标,当按下鼠标左键并进行拖动操作时,分割条的位置将随鼠标的移动发生变化。如果程序需要禁止分割条的移动操作,那么还需要继续以下操作:
在CfixedSplitteWnd类中重载以下函数,以禁止鼠标拖动和光标变化:
void CFixedSplitterWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd::OnLButtonDown(nFlags, point); file://最后修改成CWnd的函数
file://CSplitterWnd::OnLButtonDown(nFlags, point); file://替换默认的函数
}
BOOL CFixedSplitterWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
return CWnd::OnSetCursor(pWnd, nHitTest, message);
file://return CSplitterWnd::OnSetCursor(pWnd, nHitTest, message);
}
void CFixedSplitterWnd::OnMouseMove(UINT nFlags, CPoint point)
{
CWnd::OnMouseMove(nFlags, point);
file://CSplitterWnd::OnMouseMove(nFlags, point);
}
接下来就可以象在多文档重叠窗口一样,管理自己的各自视图,每个视图可以分别显示各自的文档内容,非常方便。程序中创建了两个小的窗口显示概貌图像,并用一个大窗口显示高倍放大的细节图像。通过在控制窗体中进行操作,协调各视图的工作进程,并将当前的运行结果用动画等形式显示在信息窗体中。
本程序在Windows98下Visual C++6.0环境中调试通过
更多精彩
赞助商链接