您的位置:首页 > 其它

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

2012-05-14 11:22 411 查看
四、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);

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: