SDI程序拆分窗口问题

时间:2021-10-17 21:30:58
做了一个SDI程序,已经把CSplitterWnd成员变量加入了CMainFrame类中,且已经重载了OnCreateClient并且在其中已经有了代码:m_wndSplitter.Create(this, 2, 1, CSize(2, 2), pContext)。可是程序运行时,并没有被拆分成2行1列,而是跟没有拆分一个样。书上说这样就可以了,而我不知道我的程序为什么不行。

    我想将窗口拆分成3块,上面2块用于显示2幅图片(一幅是另一幅的计算结果,不知道是不是需要2个Doc类或者2个Doc类实例),下面一块用于显示一个FormView,不知可不可以,哪位指点一下该怎么做。

7 个解决方案

#1


需要给他们创建视图,比如下面
BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT  /*lpcs*/, CCreateContext* pContext) 
{ //创建一个静态分栏窗口,分为三行一列 
     if(m_wndSplitter1.CreateStatic(this,3,1)==NULL) 
              return FALSE;
  //将CCuteFTPView连接到0行0列窗格上
     m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CCuteFTPView),CSize(100,100), pContext); 
     m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CView4),CSize(100,100),pContext); 
  //将CView4连接到0行2列
     if(m_wndSplitter2.CreateStatic(&m_wndSplitter,1,2,WS_CHILD|WS_VISIBLE, 
          m_wndSplitter.IdFromRowCol(1, 0))==NULL) 
               return FALSE; //将第1行0列再分开1行2列 
  //将CView2类连接到第二个分栏对象的0行0列
          m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(400,300),pContext); 
  //将CView3类连接到第二个分栏对象的0行1列
          m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CView3),CSize(400,300),pContext); 
               return TRUE; 

只是一个例子,并不是针对你的需求,参考改动一下就可以了。

#2


我照这个代码,可是不行!

在RUNTIME_CLASS那里出错:

F:\PROJECT\CPP\VIDEOPRO\BMPProc\MainFrm.cpp(82) : error C2653: 'CFormParamView' : is not a class or namespace name
F:\PROJECT\CPP\VIDEOPRO\BMPProc\MainFrm.cpp(82) : error C2065: 'classCFormParamView' : undeclared identifier

CFormParamView是我从CFormView继承的类。其他从CScrollView继承的类也报同样的错误!不知道为什么!——哪位高手指点一下!非常感谢!

#3


加上'CFormParamView' 它的头文件,或在MainFrm.h中public部分加上class FormParamView,类似这个意思,参考一下。
总的来说应该是你没有把需要的类关联进来。

#4


我用了两个Splitter,第一个分成2行1列,第二个在第一个的(0,0)处分成1行2列。都是用的CreateStatic函数拆分的。这个时候不管先在哪里CreateView,第一个Splitter的(0,0)高度总是0(只拆分1次的时候高度是可以正常设置的)。

#5


同问第二个问题
没有人能回答吗

#6


第二没什么特别的,直接在OnCreateClient处理就可以了

#7


对,加头文件,我昨天也和你出现的问题一样,后来加头文件就好了!

#1


需要给他们创建视图,比如下面
BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT  /*lpcs*/, CCreateContext* pContext) 
{ //创建一个静态分栏窗口,分为三行一列 
     if(m_wndSplitter1.CreateStatic(this,3,1)==NULL) 
              return FALSE;
  //将CCuteFTPView连接到0行0列窗格上
     m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CCuteFTPView),CSize(100,100), pContext); 
     m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CView4),CSize(100,100),pContext); 
  //将CView4连接到0行2列
     if(m_wndSplitter2.CreateStatic(&m_wndSplitter,1,2,WS_CHILD|WS_VISIBLE, 
          m_wndSplitter.IdFromRowCol(1, 0))==NULL) 
               return FALSE; //将第1行0列再分开1行2列 
  //将CView2类连接到第二个分栏对象的0行0列
          m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(400,300),pContext); 
  //将CView3类连接到第二个分栏对象的0行1列
          m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CView3),CSize(400,300),pContext); 
               return TRUE; 

只是一个例子,并不是针对你的需求,参考改动一下就可以了。

#2


我照这个代码,可是不行!

在RUNTIME_CLASS那里出错:

F:\PROJECT\CPP\VIDEOPRO\BMPProc\MainFrm.cpp(82) : error C2653: 'CFormParamView' : is not a class or namespace name
F:\PROJECT\CPP\VIDEOPRO\BMPProc\MainFrm.cpp(82) : error C2065: 'classCFormParamView' : undeclared identifier

CFormParamView是我从CFormView继承的类。其他从CScrollView继承的类也报同样的错误!不知道为什么!——哪位高手指点一下!非常感谢!

#3


加上'CFormParamView' 它的头文件,或在MainFrm.h中public部分加上class FormParamView,类似这个意思,参考一下。
总的来说应该是你没有把需要的类关联进来。

#4


我用了两个Splitter,第一个分成2行1列,第二个在第一个的(0,0)处分成1行2列。都是用的CreateStatic函数拆分的。这个时候不管先在哪里CreateView,第一个Splitter的(0,0)高度总是0(只拆分1次的时候高度是可以正常设置的)。

#5


同问第二个问题
没有人能回答吗

#6


第二没什么特别的,直接在OnCreateClient处理就可以了

#7


对,加头文件,我昨天也和你出现的问题一样,后来加头文件就好了!