⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 autohidebar.cpp

📁 主要用在管理系统,一个工程维护管理用vc++ 8.0 accesss数据库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    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 + -