📄 autohidebar.cpp
字号:
if (rc.PtInRect(point))
return HTHIDE;
else
{
if(TRUE == m_biHide.bRaised)
{
m_biHide.bRaised = FALSE;
m_biHide.bPushed=FALSE;
SendMessage(WM_NCPAINT);
}
}
rc = m_stud.GetRect();
rc.OffsetRect(rcBar.TopLeft());
if (rc.PtInRect(point))
return HTSTUD;
else
{
if(TRUE == m_stud.bRaised)
{
m_stud.bRaised = FALSE;
m_stud.bPushed=FALSE;
SendMessage(WM_NCPAINT);
}
}
rc=m_captionRect;
rc.OffsetRect(rcBar.TopLeft());
if(rc.PtInRect(point))
return HTNCCLIENT;
if (m_dwStyle & CBRS_ALIGN_TOP)
nRet = (HTBOTTOM == nRet?nRet: HTNOWHERE);
else if (m_dwStyle & CBRS_ALIGN_BOTTOM)
nRet = (HTTOP == nRet?nRet: HTNOWHERE);
else if (m_dwStyle & CBRS_ALIGN_LEFT)
nRet = (HTRIGHT == nRet?nRet: HTNOWHERE);
else if (m_dwStyle & CBRS_ALIGN_RIGHT)
nRet = (HTLEFT == nRet?nRet: HTNOWHERE);
else
ASSERT(FALSE); // can never happen
return nRet;
}
int CAHFloatWnd::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
m_isActive = TRUE;
SendMessage(WM_NCPAINT);
SetFocus();
return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);
}
void CAHFloatWnd::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
CWnd::OnNcLButtonUp(nHitTest, point);
if (nHitTest == HTHIDE)
{
ShowWindow(SW_HIDE);
m_biHide.bPushed = FALSE;
}
if (nHitTest == HTSTUD)
{
m_stud.bPushed = FALSE;
OnStudClick();
}
}
void CAHFloatWnd::OnStudClick()
{
m_HideItem->Dock ();
}
void CAHFloatWnd::OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case TID_AUTO_HIDE_DELAY:
{
POINT pt;
GetCursorPos(&pt);
RECT rect;
GetWindowRect(&rect);
if (!PtInRect(&rect,pt)&&!m_bCursorInAutoHideBarItem&&!GetCapture())
{
KillTimer(TID_AUTO_HIDE_DELAY);
StartAnimateDisplay(TID_SLIDE_IN);
}
}
break;
case TID_SLIDE_OUT: //Show
if(m_animDispParam.slideStep<m_animDispParam.slideStepCount-1)
{
m_animDispParam.slideStep++;
DoSlideStep();
}else{
//clean timer and reset animate display parameter
SetWindowPos(NULL,
m_animDispParam.rect.left,m_animDispParam.rect.top,
m_animDispParam.rect.Width(),m_animDispParam.rect.Height(),
SWP_NOZORDER|SWP_SHOWWINDOW);
KillTimer(TID_SLIDE_OUT);
m_animDispParam.slideStep=0;
m_animDispParam.bInAnimateDisplay=FALSE;
}
break;
case TID_SLIDE_IN: //Hide
if(m_animDispParam.slideStep>-1)
{
m_animDispParam.slideStep--;
DoSlideStep();
}else{
//clean timer and reset animate display parameter
KillTimer(TID_SLIDE_IN);
ShowWindow(SW_HIDE);
m_animDispParam.slideStep=m_animDispParam.slideStepCount-1;
m_animDispParam.bInAnimateDisplay=FALSE;
}
break;
default:
break;
}
CWnd::OnTimer(nIDEvent);
}
void CAHFloatWnd::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
BOOL bNeedPaint = FALSE;
BOOL bActiveOld = m_isActive;
m_isActive = TRUE;
if (m_isActive != bActiveOld)
bNeedPaint = TRUE;
///////////////////////////////////////////////////////////
// hit close
BOOL bHit = (nHitTest == HTHIDE);
BOOL bLButtonDown = TRUE;
BOOL bWasPushed = m_biHide.bPushed;
m_biHide.bPushed = bHit && bLButtonDown;
BOOL bWasRaised = m_biHide.bRaised;
m_biHide.bRaised = bHit && !bLButtonDown;
bNeedPaint |= (m_biHide.bPushed ^ bWasPushed) ||
(m_biHide.bRaised ^ bWasRaised);
////////////////////////////////////////////////////////////
// hit stud
bHit = (nHitTest == HTSTUD);
bWasPushed = m_stud.bPushed;
m_stud.bPushed = bHit && bLButtonDown;
bWasRaised = m_stud.bRaised;
m_stud.bRaised = bHit && !bLButtonDown;
bNeedPaint |= (m_stud.bPushed ^ bWasPushed) ||
(m_stud.bRaised ^ bWasRaised);
if (bNeedPaint)
SendMessage(WM_NCPAINT);
CWnd::OnNcLButtonDown(nHitTest, point);
}
void CAHFloatWnd::OnShowWindow(BOOL bShow, UINT nStatus)
{
CWnd * pFocusWnd=GetFocus();
if(pFocusWnd!=this)
m_isActive=FALSE;
CWnd::OnShowWindow(bShow, nStatus);
}
void CAHFloatWnd::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
// TODO: Add your message handler code here and/or call default
CWnd::OnGetMinMaxInfo(lpMMI);
if(m_animDispParam.bInAnimateDisplay){
lpMMI->ptMinTrackSize.x=5;
lpMMI->ptMinTrackSize.y=5;
}
}
//CAHFloatWnd implementation ends
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
// CHidePageItem
CHidePageItem::CHidePageItem()
{
m_lastAHFloatWndRect.SetRectEmpty();
}
CHidePageItem::~CHidePageItem()
{
}
void CHidePageItem::Draw(CDC *pDC, BOOL bHorz)
{
if(bHorz)
::DrawIconEx(pDC->m_hDC,m_rect.left+3, m_rect.top+(m_rect.Height()-16)/2+1,m_hIcon,16,16,0,NULL,DI_NORMAL);
else
::DrawIconEx(pDC->m_hDC,m_rect.left+(m_rect.Width()-16)/2, m_rect.top + 3,m_hIcon,16,16,0,NULL,DI_NORMAL);
CRect rect = m_rect;
rect.left += 3;
rect.top += 1;
if(TRUE == m_isActive)
{
int nPrevBkMode = pDC->SetBkMode(TRANSPARENT);
if(TRUE == bHorz)
{
rect.left += 16 + 6;
pDC->ExtTextOut(rect.left, rect.top+3, ETO_CLIPPED, NULL, m_sText, NULL);
}
else
{
rect.top += 16 + 6;
pDC->ExtTextOut(rect.right-3, rect.top, ETO_CLIPPED, NULL, m_sText, NULL);
}
pDC->SetBkMode(nPrevBkMode);
}
if(TRUE == bHorz)
{
pDC->MoveTo (m_rect.right, m_rect.top+2 );
pDC->LineTo (m_rect.right, m_rect.bottom );
}
else
{
pDC->MoveTo (m_rect.left, m_rect.bottom );
pDC->LineTo (m_rect.right, m_rect.bottom );
}
}
//////////////////////////////////////////////////////////////////////////////////////////
// CHideItem
CHideItem::CHideItem()
{
m_nActivePage = -1;
}
CHideItem::~CHideItem()
{
}
void CHideItem::Draw(CDC *pDC)
{
CBrush brush(GetSysColor(COLOR_3DFACE));
pDC->FillRect(m_rect,&brush);
CPen pen(PS_SOLID, 1, RGB(128,128,128));
HPEN poldPen = (HPEN)pDC->SelectObject (&pen);
if(m_dwStyle & CBRS_ORIENT_HORZ)
{
pDC->MoveTo (m_rect.left, m_rect.top );
pDC->LineTo (m_rect.left, m_rect.bottom );
pDC->MoveTo (m_rect.right, m_rect.top );
pDC->LineTo (m_rect.right, m_rect.bottom );
if (m_dwStyle & CBRS_ALIGN_TOP)
{
pDC->MoveTo (m_rect.left, m_rect.bottom );
pDC->LineTo (m_rect.right+1, m_rect.bottom );//MS CDC Bug???
}
else if (m_dwStyle & CBRS_ALIGN_BOTTOM)
{
pDC->MoveTo (m_rect.left, m_rect.top );
pDC->LineTo (m_rect.right, m_rect.top );
}
}
else if(m_dwStyle & CBRS_ORIENT_VERT)
{
pDC->MoveTo (m_rect.left, m_rect.top );
pDC->LineTo (m_rect.right, m_rect.top );
pDC->MoveTo (m_rect.left, m_rect.bottom );
pDC->LineTo (m_rect.right, m_rect.bottom );
if (m_dwStyle & CBRS_ALIGN_LEFT)
{
pDC->MoveTo (m_rect.right, m_rect.top );
pDC->LineTo (m_rect.right, m_rect.bottom+1);//MS CDC Bug???
}
else if (m_dwStyle & CBRS_ALIGN_RIGHT)
{
pDC->MoveTo (m_rect.left, m_rect.top );
pDC->LineTo (m_rect.left, m_rect.bottom );
}
}
CHidePageItem* pHidePageItem;
for(int i =0; i< m_arrPags.GetSize(); i++)
{
pHidePageItem = (CHidePageItem*)m_arrPags[i];
if(m_dwStyle & CBRS_ORIENT_HORZ)
{
pHidePageItem->Draw (pDC, TRUE);
}
else if(m_dwStyle & CBRS_ORIENT_VERT)
{
pHidePageItem->Draw (pDC, FALSE);
}
}
pDC->SelectObject (poldPen);
}
void CHideItem::AddPageItem(CDockPageBar* pPageBar, CWnd* pWnd, DWORD dwStyle)
{
m_dwStyle = dwStyle;
//Copy the dockPageBar's Rect
pPageBar->GetWindowRect (m_oldWndRect );
pPageBar->GetParentFrame()->ScreenToClient (&m_oldWndRect);
m_pAutoHideBar = pWnd;
m_pDockPageBar = pPageBar;
pPageBar->ShowWindow (SW_HIDE);
m_wndFloat.CreateEx(WS_EX_LEFT, AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW),
NULL, (WS_CHILDWINDOW|WS_BORDER|WS_THICKFRAME|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS),
m_oldWndRect,
AfxGetMainWnd(), 0);
m_wndFloat.m_dwStyle = dwStyle;
m_wndFloat.ShowWindow (SW_HIDE);
m_wndFloat.m_HideItem = this;
m_nActivePage = pPageBar->m_nActivePage;
POSITION pos;
CPageItem* pPageItem;
for(pos=pPageBar->m_PageList.GetHeadPosition();pos!=NULL;)
{
pPageItem=(CPageItem*)pPageBar->m_PageList.GetNext(pos);
if(pPageItem)
{
CHidePageItem* pHidePage = new CHidePageItem;
pHidePage->m_hIcon = pPageItem->m_hIcon;
pHidePage->m_pWnd = pPageItem->m_pWnd;
pHidePage->m_sText = pPageItem->m_sText;
m_arrPags.Add (pHidePage);
}
}
}
void CHideItem::UpDateSize(CDC* pDC, CRect *rect)
{
CHidePageItem* pHidePageItem;
m_rect = *rect;
for(int i =0; i< m_arrPags.GetSize(); i++)
{
pHidePageItem = (CHidePageItem*)m_arrPags[i];
if(NULL != pHidePageItem)
{
if(m_dwStyle & CBRS_ORIENT_HORZ)
{
pHidePageItem->m_rect = *rect;
pHidePageItem->m_rect.right = pHidePageItem->m_rect.left + 21;
pHidePageItem->m_isActive = FALSE;
if(m_nActivePage == i)
{
pHidePageItem->m_rect.right += 24;
pHidePageItem->m_rect.right += pDC->GetTextExtent (pHidePageItem->m_sText).cx;
pHidePageItem->m_rect.right += AUTO_HIDE_BAR_WIDTH;
pHidePageItem->m_isActive = TRUE;
}
m_rect.right = rect->left = pHidePageItem->m_rect.right;
}
else if(m_dwStyle & CBRS_ORIENT_VERT)
{
pHidePageItem->m_rect = *rect;
pHidePageItem->m_rect.bottom = pHidePageItem->m_rect.top + 21;
pHidePageItem->m_isActive = FALSE;
if(m_nActivePage == i)
{
pHidePageItem->m_rect.bottom += 24;
pHidePageItem->m_rect.bottom += pDC->GetTextExtent (pHidePageItem->m_sText).cx;
pHidePageItem->m_rect.bottom += AUTO_HIDE_BAR_WIDTH;
pHidePageItem->m_isActive = TRUE;
}
m_rect.bottom = rect->top = pHidePageItem->m_rect.bottom;
}
}
}
}
BOOL CHideItem::OnMouseMove(CPoint pt)
{
CHidePageItem* pHidePageItem;
for(int i =0; i< m_arrPags.GetSize(); i++)
{
pHidePageItem = (CHidePageItem*)m_arrPags[i];
if(NULL != pHidePageItem)
{
if(pHidePageItem->m_rect.PtInRect (pt))
{
Show(i);
if(m_nActivePage != i)
{
return TRUE;
}
else
{
return FALSE;
}
}
}
}
return FALSE;
}
void CHideItem::Show(int nShow)
{
if(m_nActivePage == nShow&&m_wndFloat.IsWindowVisible ()||
m_wndFloat.m_animDispParam.bInAnimateDisplay)
return;
CRect rect;
m_pAutoHideBar->GetWindowRect(rect);
//Show the new activated one
CHidePageItem * pCurActivePageItem=((CHidePageItem*)m_arrPags[nShow]);
//Get the proper rect size for the new activated item
if(pCurActivePageItem->m_lastAHFloatWndRect.IsRectEmpty())
m_wndFloat.GetWindowRect (m_oldWndRect);
else
m_oldWndRect=pCurActivePageItem->m_lastAHFloatWndRect;
if (m_dwStyle & CBRS_ORIENT_HORZ)
{
rect.bottom = rect.top + m_oldWndRect.Height();
if (m_dwStyle & CBRS_ALIGN_TOP)
{
rect.OffsetRect (0, AUTO_HIDE_BAR_WIDTH-2);
}
else if (m_dwStyle & CBRS_ALIGN_BOTTOM)
{
rect.OffsetRect (0, -m_oldWndRect.Height());
}
}
else if (m_dwStyle & CBRS_ORIENT_VERT)
{
rect.right = rect.left + m_oldWndRect.Width();
if (m_dwStyle & CBRS_ALIGN_LEFT)
rect.OffsetRect (AUTO_HIDE_BAR_WIDTH, 0);
else if (m_dwStyle & CBRS_ALIGN_RIGHT)
rect.OffsetRect (-m_oldWndRect.Width(), 0);
}
else
{
ASSERT(FALSE); // can never happen
}
//Hide the float window first
m_wndFloat.StartAnimateDisplay(TID_SLIDE_IN);
m_wndFloat.MoveWindow(0,0,0,0);
//Hide the previous active page
((CHidePageItem*)m_arrPags[m_nActivePage])->m_pWnd->ShowWindow (SW_HIDE);
((CHidePageItem*)m_arrPags[m_nActivePage])->m_pWnd->SetParent (m_pDockPageBar);
//Set the new activated page's to the float window
CWnd * pchild = pCurActivePageItem->m_pWnd;
pchild->SetParent (&m_wndFloat);
m_wndFloat.m_Title = pCurActivePageItem->m_sText;
m_wndFloat.m_activePageItem=pCurActivePageItem;
CWnd* pFrameWnd=AfxGetMainWnd();
//Prevent the m_wndFloat window from being shadowed by the client view window
BRING_CLIENT_WINDOW_TO_BOTTOM(pFrameWnd);
//Use the client coordinate of the main frame
pFrameWnd->ScreenToClient(&rect);
//Prevent the m_pAutoHideBar window from being shadowed by the m_wndFloat window
m_wndFloat.SetWindowPos(m_pAutoHideBar,rect.left,rect.top ,rect.Width (), rect.Height (),SWP_HIDEWINDOW);
m_wndFloat.m_animDispParam.rect=rect;
//Move the new activated page to the float window
CRect clientRect;
m_wndFloat.GetClientRect(clientRect);
pchild->MoveWindow(clientRect);
pchild->ShowWindow (SW_SHOW);
//Animate show
m_nActivePage = nShow;
m_wndFloat.StartAnimateDisplay(TID_SLIDE_OUT);
}
void CHideItem::Dock()
{
((CHidePageItem*)m_arrPags[m_nActivePage])->m_pWnd->SetParent (m_pDockPageBar);
RemoveAll();
m_wndFloat.DestroyWindow();
m_pDockPageBar->ShowWindow (SW_SHOW);
m_pDockPageBar->UpdateSize();
((CAutoHideBar*)m_pAutoHideBar)->UpdateBar();
}
/////////////////////////////////////////////////////////////////////////////
// remove all item (2004/04/06)
void CHideItem::RemoveAll()
{
CHidePageItem* pHidePageItem;
int count = m_arrPags.GetSize();
for(int i =0; i< count; i++)
{
pHidePageItem = (CHidePageItem*)m_arrPags[0];
delete pHidePageItem;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -