龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

使用VC6.0实现窗口的任意分割(6)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
四、CSplitterWnd的扩展 CSplitterWnd扩展话题是很多的,我们可以通过对原有方法的覆盖或者增加新的方法来扩展CSplitterWnd。我们在此仅举两个方面的例子。

  四、CSplitterWnd的扩展

  CSplitterWnd扩展话题是很多的,我们可以通过对原有方法的覆盖或者增加新的方法来扩展CSplitterWnd。我们在此仅举两个方面的例子。

  4.1锁定切分条

  当用户创建好分割窗口后,有时并不希望通过拖动切分条来调节窗口的大小。这时就必须锁定切分条。锁定切分条的最简单的方法莫过于不让CSplitterWnd来处理WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_SETCURSOR消息,而是将这些消息交给CWnd窗口进行处理,从而屏蔽掉这些消息。拿WM_LBUTTONDOWN处理过程来说。修改为如下:


void CXXSplitterWnd::OnLButtonDown(UINT nFlags,CPoint point) {
        CWnd::OnLButtonDown(nFlags,point);
}
  其余的处理方法类似。

  4.2切分条的定制

  由Window自己生成的切分条总是固定的,没有任何的变化,我们在使用一些软件比如ACDSee的时候却能发现它们的切分条却是和自动生成的切分条不一样的。那么如何定制自己的切分条呢?通过重载CSplitterWnd的虚方法OnDrawSplitter和OnInvertTracker可以达到这样的目的。下面的代码生成的效果是分割窗口的边界颜色为红色,分割条的颜色为绿色.代码如下:


void CSplitterWndEx::OnDrawSplitter(CDC *pDC, ESplitType nType, const CRect &rectArg)
{
                  if(pDC==NULL)
                  {
                  RedrawWindow(rectArg,NULL,RDW_INVALIDATE|RDW_NOCHILDREN);
                  return;
                  }
                  ASSERT_VALID(pDC);
                  CRect rc=rectArg;
                  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));
}
void CSplitterWndEx::OnInvertTracker(CRect &rect)
{
                  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中的其余的一些虚拟方法就可以生成具有自己个性的分割窗口了。

精彩图集

赞助商链接