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

来源:互联网 发布:粘土动画制作软件 编辑:程序博客网 时间:2024/05/17 04:41

四、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);
}