WEB开发网
开发学院软件开发VC 用Visual C++中实现混合分割视图 阅读

用Visual C++中实现混合分割视图

 2008-11-13 19:31:39 来源:WEB开发网   
核心提示: 2、在CMainFrame类里声明分割视图的变量:CFixedSplitter SplitterH1; file://水平分割视窗1CFixedSplitter SplitterH2; file://水平分割视窗2CFixedSplitter SplitterV; file://垂直分割视

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环境中调试通过

上一页  1 2 

Tags:Visual 实现 混合

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接