WEB开发网
开发学院软件开发VC 使用VC6.0实现窗口的任意分割 阅读

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

 2010-07-06 20:43:38 来源:WEB开发网   
核心提示:四、CSplitterWnd的扩展CSplitterWnd扩展话题是很多的,我们可以通过对原有方法的覆盖或者增加新的方法来扩展CSplitterWnd,使用VC6.0实现窗口的任意分割(5),我们在此仅举两个方面的例子,4.1锁定切分条当用户创建好分割窗口后,下面的代码生成的效果是分割窗口的边界颜色为红色,分割条的颜色

四、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中的其余的一些虚拟方法就可以生成具有自己个性的分割窗口了。

我的电子信箱:tingya@njpost.com.cn 和tingya@263.net

地址:南京邮政局计算机中心 张中庆

邮政编码:210008

上一页  1 2 3 4 5 

Tags:使用 VC 实现

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