📄 dockpagebar.cpp
字号:
if(i > 0)
{
sText = sText.Left(l-2);
sText += "...";
}
pDC->TextOut (gripper.left, gripper.top, sText);
}
pDC->SetTextColor (crOldText);
pDC->SetBkMode(nPrevBkMode);
pDC->SelectObject(oldFont);
CPoint ptOrgBtn;
ptOrgBtn = CPoint(gripper.right - 15, gripper.top);
m_biHide.Move(ptOrgBtn);
m_biHide.Paint(pDC, m_isActive);
ptOrgBtn.x -= 17;
m_stud.Move (ptOrgBtn);
m_stud.Paint(pDC, m_isActive);
}
void CDockPageBar::NcCalcClient(LPRECT pRc, UINT nDockBarID)
{
CRect rcBar(pRc); // save the bar rect
// subtract edges
baseCDockPageBar::NcCalcClient(pRc, nDockBarID);
if (!HasGripper())
return;
CRect rc(pRc); // the client rect as calculated by the base class
BOOL bHorz = (nDockBarID == AFX_IDW_DOCKBAR_TOP) ||
(nDockBarID == AFX_IDW_DOCKBAR_BOTTOM);
if (bHorz)
rc.DeflateRect(0, m_cyGripper, 2, 0);
else
rc.DeflateRect(0, m_cyGripper, 0, 0);
*pRc = rc;
}
void CDockPageBar::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
if (nHitTest == HTCLOSE)
m_pDockSite->ShowControlBar(this, FALSE, FALSE); // hide
if (nHitTest == HTSTUD)
OnStudClick();
baseCDockPageBar::OnNcLButtonUp(nHitTest, point);
}
void CDockPageBar::OnStudClick()
{
GetParentFrame()->PostMessage(WM_AUTOHIDE_ON, m_nDockBarID, (LPARAM)this);
}
BOOL CDockPageBar::HasGripper() const
{
if (IsFloating())
return FALSE;
return TRUE;
}
UINT CDockPageBar::OnNcHitTest(CPoint point)
{
CRect rcBar;
GetWindowRect(rcBar);
UINT nRet = baseCDockPageBar::OnNcHitTest(point);
if (nRet != HTCLIENT)
return nRet;
CRect rc = m_biHide.GetRect();
rc.OffsetRect(rcBar.TopLeft());
if (rc.PtInRect(point))
return HTCLOSE;
rc = m_stud.GetRect();
rc.OffsetRect(rcBar.TopLeft());
if (rc.PtInRect(point))
return HTSTUD;
return HTCLIENT;
}
/////////////////////////////////////////////////////////////////////////////
// about PageItem
void CDockPageBar::GetClientRect(LPRECT lpRect, BOOL isMulti)
{
CWnd::GetClientRect(lpRect);
if(TRUE == isMulti)
lpRect->bottom -= ITEMBUTTON_HEIGHT;
}
CPageItem* CDockPageBar::GetPageItem(int nIndex)
{
CPageItem *pItem = NULL;
POSITION pos = m_PageList.FindIndex(nIndex);
if(pos)
pItem = (CPageItem*)m_PageList.GetAt(pos);
return pItem;
}
void CDockPageBar::SetActivePage(int nIndex)
{
if(nIndex == m_nActivePage)
return;
CPageItem *pItem;
pItem = (CPageItem*)GetPageItem(nIndex);
if(!pItem) return;
m_nActivePage = nIndex;
m_Title = pItem->m_sText;
SetWindowText(m_Title);
SendMessage(WM_NCPAINT);
Invalidate();
}
void CDockPageBar::OnSize(UINT nType, int cx, int cy)
{
UpdateSize();
Invalidate(FALSE);
}
void CDockPageBar::UpdateSize()
{
UINT PageCount = m_PageList.GetCount();
if(PageCount < 1) return;
CPageItem *pItem;
CRect rect,ClientRect,ItemRect;
if(PageCount == 1)
{
GetClientRect(ClientRect, FALSE);
pItem = (CPageItem*)GetPageItem(0);;
if(pItem->m_pWnd)
{
pItem->m_pWnd->MoveWindow(ClientRect);
pItem->m_pWnd->ShowWindow(SW_SHOW);
}
return;
}
POSITION pos;
GetClientRect(rect, FALSE);
rect.left += 6;
rect.right -= 6;
rect.bottom -= 1;
rect.top = rect.bottom - ITEMBUTTON_HEIGHT + 2;
GetClientRect(ClientRect, TRUE);
ItemRect = rect;
int AreaWidth = 0,ItemWidth,ItemIndex=0;
for(pos=m_PageList.GetHeadPosition();pos!=NULL;ItemIndex++)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
if(pItem)
{
ItemWidth = pItem->m_TabWidth;
AreaWidth += ItemWidth;
ItemRect.right = ItemRect.left+ItemWidth-1;
pItem->m_rect = ItemRect;
ItemRect.left = ItemRect.right + 1;
if(pItem->m_pWnd)
pItem->m_pWnd->MoveWindow(ClientRect);
}
}
if(AreaWidth > rect.Width())
{
ItemRect = rect;
int AreaWidth,MaxWidth = rect.Width()/PageCount;
for(pos=m_PageList.GetHeadPosition();pos!=NULL;)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
if(pItem)
{
AreaWidth = pItem->m_TabWidth;
ItemWidth = (MaxWidth < AreaWidth)?MaxWidth:AreaWidth;
ItemRect.right = ItemRect.left+ItemWidth;
pItem->m_rect = ItemRect;
ItemRect.left = ItemRect.right + 1;
}
}
}
}
BOOL CDockPageBar::AddPage(CWnd *pWnd, LPCTSTR sText, UINT IconID)
{
ASSERT(IsWindow(pWnd->m_hWnd));
CPageItem *pItem;
pItem = new CPageItem();
pItem->m_pWnd = pWnd;
pItem->m_pWnd->SetParent (this);
pItem->m_sText = sText;
CClientDC dc(this);
pItem->m_TabWidth = dc.GetTextExtent (sText).cx;
if(IconID)
{
pItem->m_hIcon = AfxGetApp()->LoadIcon(IconID);
pItem->m_TabWidth += 18;
}
else
pItem->m_hIcon = NULL;
pItem->m_TabWidth += 9;
if(pWnd)
{
CRect rect;
GetClientRect(rect, m_PageList.GetCount()>1?TRUE:FALSE);
pWnd->MoveWindow(rect);
pWnd->ShowWindow(SW_HIDE);
}
m_PageList.AddTail(pItem);
UpdateWindow();
return TRUE;
}
BOOL CDockPageBar::AddPage(CPageItem *pPageItem)
{
pPageItem->m_pWnd->SetParent (this);
m_PageList.AddTail(pPageItem);
UpdateWindow();
return TRUE;
}
BOOL CDockPageBar::AddPage(CDockPageBar *dockPageBar)
{
POSITION pos;
CPageItem* pItem;
for(pos = dockPageBar->m_PageList.GetHeadPosition();pos!=NULL;)
{
pItem=(CPageItem*)dockPageBar->m_PageList.GetNext(pos);
if(pItem)
{
AddPage(pItem);
}
}
dockPageBar->m_pDockContext->m_pDockSite->FloatControlBar(dockPageBar,CSize(0,0),0);
dockPageBar->m_PageList.RemoveAll();
UpdateWindow();
return dockPageBar->DestroyWindow ();
}
CPageItem* CDockPageBar::DeletePage()
{
CPageItem *pItem = NULL;
POSITION pos = m_PageList.FindIndex(m_nActivePage);
if(!pos)
{
return NULL;
}
pItem = (CPageItem*)m_PageList.GetAt(pos);
pItem->m_pWnd->ShowWindow(SW_HIDE);
m_PageList.RemoveAt (pos);
m_nActivePage = -1;
UpdateWindow();
return pItem;
}
void CDockPageBar::UpdateWindow()
{
UpdateSize();
if(m_nActivePage < 0)
SetActivePage(0);
Invalidate(FALSE);
}
/////////////////////////////////////////////////////////////////////////////
//
void CDockPageBar::OnPaint()
{
CPaintDC dc(this);
if(m_PageList.GetCount() == 0)
return;
CPageItem *pItem;
POSITION pos;
int nItemIndex = 0;
CRect rect;
GetClientRect(rect, FALSE);
rect.left +=1;
rect.right -=1;
rect.bottom -=1;
rect.top = rect.bottom - ITEMBUTTON_HEIGHT + 4;
CBrush brush(RGB(247,243,233));
dc.FillRect(rect,&brush);
CPen pen(PS_SOLID,1,GetSysColor(COLOR_3DDKSHADOW));
HPEN oldPen = (HPEN)dc.SelectObject (&pen);
dc.MoveTo (rect.TopLeft() );
dc.LineTo (rect.right, rect.top);
dc.SelectObject (oldPen);
HFONT oldFont = (HFONT)dc.SelectObject (m_font);
// draw PageItem
for(pos=m_PageList.GetHeadPosition();pos!=NULL;nItemIndex++)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
if(pItem)
{
pItem->Draw(&dc,(m_nActivePage==nItemIndex)?TRUE:FALSE);
}
}
dc.SelectObject (oldFont);
}
void CDockPageBar::OnLButtonDown(UINT nFlags, CPoint point)
{
SetFocus();
UINT nItemIndex=0;
POSITION pos;
CPageItem *pItem;
for(pos=m_PageList.GetHeadPosition();pos!=NULL;nItemIndex++)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
if(pItem)
{
if(pItem->m_rect.PtInRect(point))
{
SetActivePage(nItemIndex);
CanDrag(point); // drag PageItem
return;
}
}
}
((CDockPageBarContext*)m_pDockContext)->m_isPage = FALSE;
//baseCDockPageBar::OnLButtonDown(nFlags, point);
if (m_pDockBar != NULL)
{
// start the drag
ASSERT(m_pDockContext != NULL);
ClientToScreen(&point);
m_pDockContext->StartDrag(point);
}
else
CWnd::OnLButtonDown(nFlags, point);
}
void CDockPageBar::EnableDocking(DWORD dwDockStyle)
{
// must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only
ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);
// cannot have the CBRS_FLOAT_MULTI style
ASSERT((dwDockStyle & CBRS_FLOAT_MULTI) == 0);
// the bar must have CBRS_SIZE_DYNAMIC style
ASSERT((m_dwStyle & CBRS_SIZE_DYNAMIC) != 0);
m_dwDockStyle = dwDockStyle;
if (m_pDockContext == NULL)
{
m_pDockContext = new CDockPageBarContext(this);
m_pDPBContext.AddTail(m_pDockContext); //hengai
}
// permanently wire the bar's owner to its current parent
if (m_hWndOwner == NULL)
m_hWndOwner = ::GetParent(m_hWnd);
}
void CDockPageBar::CanDrag(CPoint pt)
{
SetCapture();
// get messages until capture lost or cancelled/accepted
while (CWnd::GetCapture() == this)
{
MSG msg;
if (!::GetMessage(&msg, NULL, 0, 0))
{
AfxPostQuitMessage(msg.wParam);
break;
}
switch (msg.message)
{
case WM_LBUTTONUP:
ReleaseCapture();
break;
case WM_MOUSEMOVE:
Move(msg.pt);
break;
default:
DispatchMessage(&msg);
break;
}
}
}
void CDockPageBar::Move(CPoint pt)
{
CRect rect;
GetClientRect(&rect, FALSE);
rect.top = rect.bottom - ITEMBUTTON_HEIGHT - 5;
ScreenToClient(&pt);
if(rect.PtInRect(pt))
{
int nItemIndex=0;
POSITION pos;
CPageItem *pItem;
for(pos=m_PageList.GetHeadPosition();pos!=NULL;nItemIndex++)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
if(pItem)
{
if(pItem->m_rect.PtInRect(pt))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -