窗口切分代码。

CFormView          1/4

---------------------------

CFormView          3/4

 

CRect ClientRect;
 GetClientRect(&ClientRect);
 if(!m_wndSplitter.CreateStatic(this,2,1))
  return FALSE;
 if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CPliView),CSize(ClientRect.Width(),ClientRect.Height()/4),pContext))
  return FALSE;

 if(!m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CFormV),CSize(ClientRect.Width(),ClientRect.Height()/4*3),pContext))
  return FALSE;

 

             CFormView  Width 1 Height 1/2

---------------------------------------------------

CFormView 1/2 1/2 | CFormView 1/2 1/2

 

CRect ClientRect;
 GetClientRect(&ClientRect);
 if(!m_wndSplitter.CreateStatic(this,2,1))
  return FALSE;
 if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CPliView),CSize(ClientRect.Width(),ClientRect.Height()/2),pContext))
  return FALSE;
//
//  if(!m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CFormV),CSize(ClientRect.Width(),ClientRect.Height()/4*3),pContext))
//   return FALSE;
 if (!m_wndSplitter2.CreateStatic(
  &m_wndSplitter,     // our parent window is the first splitter
  1,2,               // the new splitter is 2 rows, 1 column
  WS_CHILD | WS_VISIBLE | WS_BORDER,  // style, WS_BORDER is needed
  m_wndSplitter.IdFromRowCol(1, 0)
  // new splitter is in the first row, 2nd column of first splitter
  ))
 {
  TRACE0("Failed to create nested splitter/n");
  return FALSE;
 }
 if (!m_wndSplitter2.CreateView(0, 0,
  RUNTIME_CLASS(CFormV), CSize(ClientRect.Width()/2, ClientRect.Height()/2), pContext))
 {
  TRACE0("Failed to create second pane/n");
  return FALSE;
 }
 if (!m_wndSplitter2.CreateView(0, 1,
  RUNTIME_CLASS(CFormV), CSize(ClientRect.Width()/2, ClientRect.Height()/2), pContext))
 {
  TRACE0("Failed to create third pane/n");
  return FALSE;
 }

 

上面两个都按照我的思路来做了。可以当我再写第三个也就是

CFormView |CFormView

------------------------------

          CFormView

时候上面的距离总是为零。不知道为何?

问题解决了。。。。

——————————————————————————————————

 m_wndSplitter.CreateStatic(this,1,2);  
 m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CFormV),CSize(200,100),pContext);  
 m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CFrameWnd),CSize(200,100),pContext);  


 m_wndSplitter2.CreateStatic(m_wndSplitter.GetPane(0,0),2,1);  
 m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CFormV),CSize(200,100),pContext);  
 m_wndSplitter2.CreateView(1,0,RUNTIME_CLASS(CFormV),CSize(200,100),pContext);  

 

另外通过重载OnDrawSplitter与OnInvertTracker 可以改变分隔条的颜色。但是拖动的时候会出现图像重叠的情况,只适合锁定的情况下使用。

http://www.vckbase.com/document/viewdoc/?id=192里面还有适用于对话框切割的方法。

 

void CViewExSplitWnd::OnDrawSplitter(CDC* pDC, ESplitType nType, const CRect& rect)
{
 // TODO: 在此添加专用代码和/或调用基类
 if(pDC==NULL)
 {
  RedrawWindow(rect,NULL,RDW_INVALIDATE|RDW_NOCHILDREN);
  return;
 }
 ASSERT_VALID(pDC);
 CRect rc=rect;
 switch(nType)
 {
 case splitBorder:
  //重画分割窗口边界,使之为红色
  pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));
  rc.InflateRect(-CX_BORDER,-CY_BORDER);
  pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));

  return;
 case splitBox:
  pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
  rc.InflateRect(-CX_BORDER,-CY_BORDER);
  pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
  rc.InflateRect(-CX_BORDER,-CY_BORDER);
  pDC->FillSolidRect(rc,RGB(0,0,0));
  pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
  return;
 case splitBar:
  //重画分割条,使之为绿色
  pDC->FillSolidRect(rc,RGB(255,255,255));
  rc.InflateRect(-5,-5);
  pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));

  return;
 default:
  ASSERT(FALSE);
 }
 pDC->FillSolidRect(rc,RGB(0,0,255));

 CSplitterWnd::OnDrawSplitter(pDC, nType, rect);
}

void CViewExSplitWnd::OnInvertTracker(const CRect& rect)
{
 // TODO: 在此添加专用代码和/或调用基类
 ASSERT_VALID(this);
 ASSERT(!rect.IsRectEmpty());
 ASSERT((GetStyle()&WS_CLIPCHILDREN)==0);
 CRect rc=rect;
 rc.InflateRect(2,2);
 CDC* pDC=GetDC();
 CBrush* pBrush=CDC::GetHalftoneBrush();
 HBRUSH hOldBrush=NULL;
 if(pBrush!=NULL) hOldBrush=(HBRUSH)SelectObject(pDC->m_hDC,pBrush->m_hObject);
 pDC->PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),BLACKNESS);

 if(hOldBrush!=NULL)
  SelectObject(pDC->m_hDC,hOldBrush);
 ReleaseDC(pDC);

 CSplitterWnd::OnInvertTracker(rect);
}

 

1月11号:

如果想使用原来的View,可以使用如下的语句进行创建。

if(!m_wndSplitter.CreateView(0,0,pContext->m_pNewViewClass,CSize(130,50),pContext))
 {
  TRACE0("Failed to create first pane/n");
  return FALSE;
 }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值