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

📄 autohidebar.cpp

📁 模拟msdn界面的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////
//
// CAutoHideBar            Version 1.2
//
// Created: Mar 30, 2004
//
/////////////////////////////////////////////////////////////////////////
// Copyright (C) 2004 by Cuick. All rights reserved.
//
// This code is free for personal and commercial use, providing this 
// notice remains intact in the source files and all eventual changes are
// clearly marked with comments.
//
// Send bug reports, bug fixes, enhancements, requests, flames, etc. to
// Cuick@163.net
//
// Hint: These classes are intended to be used as base classes. Do not
// simply add your code to these file - instead create a new class
// derived from CDockPageBar classes and put there what you need. See 
// CTestBar classes in the demo projects for examples.
// Modify this file only to fix bugs, and don't forget to send me a copy.
/////////////////////////////////////////////////////////////////////////
// Acknowledgements:
//

#include "stdafx.h"
#include "AutoHideBar.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// CAHFloatWnd

CAHFloatWnd::CAHFloatWnd()
{
	m_font.CreatePointFont(85, "Tahoma");
	m_Title = "Test";
}

CAHFloatWnd::~CAHFloatWnd()
{
}


BEGIN_MESSAGE_MAP(CAHFloatWnd, CWnd)
	//{{AFX_MSG_MAP(CAHFloatWnd)
	ON_WM_NCCALCSIZE()
	ON_WM_SIZE()
	ON_WM_NCPAINT()
	ON_WM_NCMOUSEMOVE()
	ON_WM_NCHITTEST()
	ON_WM_MOUSEACTIVATE()
	ON_WM_NCACTIVATE()
	ON_WM_NCLBUTTONUP()
	ON_WM_TIMER()
	ON_WM_NCLBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CAHFloatWnd message handlers

void CAHFloatWnd::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
{
	CWnd::OnNcCalcSize(bCalcValidRects, lpncsp);

	CRect rc(&lpncsp->rgrc[0]);
	rc.DeflateRect(0, 20, 0, 0);
	lpncsp->rgrc[0] = rc;
}

void CAHFloatWnd::OnNcPaint() 
{
	//CWnd::OnNcPaint();
    CWindowDC dc(this);

    CRect rcBar;
    GetWindowRect(rcBar);
	rcBar.OffsetRect (-rcBar.TopLeft ());
	CRect rect = rcBar;
	rect.right = ::GetSystemMetrics(SM_CXFRAME);
	dc.FillSolidRect(&rect, ::GetSysColor(COLOR_BTNFACE));
	rect = rcBar;
	rect.top = rect.bottom - ::GetSystemMetrics(SM_CXFRAME);
	dc.FillSolidRect(&rect, ::GetSysColor(COLOR_BTNFACE));
	rect = rcBar;
	rect.left = rect.right - ::GetSystemMetrics(SM_CXFRAME);
	dc.FillSolidRect(&rect, ::GetSysColor(COLOR_BTNFACE));

    rcBar.bottom = rcBar.top + 20 + ::GetSystemMetrics(SM_CXFRAME);
	dc.FillSolidRect(&rcBar, ::GetSysColor(COLOR_BTNFACE));
	
	CRect gripper = rcBar;
    CRect rcbtn = m_biHide.GetRect();


    gripper.DeflateRect(3, 4);
	gripper.right -= 2;
	gripper.bottom -= 0;

	CDC* pDC = &dc;
	HFONT oldFont = (HFONT)pDC->SelectObject (m_font);
	
	int nPrevBkMode = pDC->SetBkMode(TRANSPARENT);
	COLORREF crOldText;

	if(TRUE == m_isActive)			// active state
	{
		CBrush brush(RGB(10,36,106));
		pDC->FillRect(&gripper, &brush);

		crOldText = pDC->SetTextColor(RGB(255,255,255));
	}
	else
	{
		CPen pen(PS_SOLID, 1, RGB(128,128,128));
		
		HPEN poldPen = (HPEN)pDC->SelectObject (&pen);
		
		pDC->MoveTo (gripper.TopLeft());
		pDC->LineTo (gripper.right ,gripper.top );
		pDC->LineTo (gripper.BottomRight() );
		pDC->LineTo (gripper.left ,gripper.bottom );
		pDC->LineTo (gripper.TopLeft ());
		pDC->SelectObject (poldPen);

		crOldText = pDC->SetTextColor(RGB(0,0,0));
	}
	
	gripper.left += 4;
	gripper.top += 2;

	// draw caption
	if (!m_Title.IsEmpty())
	{
		CString sText = m_Title;
		int l = sText.GetLength();
		int i;

		for(i=0;i<10 && pDC->GetTextExtent(sText).cx > (gripper.Width() - 30);i++,l-=2)
			sText = sText.Left(l-2);
		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 CAHFloatWnd::OnSize(UINT nType, int cx, int cy) 
{
	CWnd::OnSize(nType, cx, cy);
	
	CWnd* pWnd = GetWindow(GW_CHILD);
	if (pWnd != NULL)
	{
		pWnd->MoveWindow(0, 0, cx, cy);
	}
	
}


void CAHFloatWnd::OnNcMouseMove(UINT nHitTest, CPoint point) 
{
	BOOL bNeedPaint = FALSE;

    CPoint pt;
    ::GetCursorPos(&pt);

	///////////////////////////////////////////////////////////
	// hit close
    BOOL bHit = (OnNcHitTest(pt) == HTHIDE);
    BOOL bLButtonDown = (::GetKeyState(VK_LBUTTON) < 0);

    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 = (OnNcHitTest(pt) == 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::OnNcMouseMove(nHitTest, point);
}

UINT CAHFloatWnd::OnNcHitTest(CPoint point) 
{
	CRect rcBar;
    GetWindowRect(rcBar);

	UINT nRet = CWnd::OnNcHitTest(point);

    CRect rc = m_biHide.GetRect();
    rc.OffsetRect(rcBar.TopLeft());
    if (rc.PtInRect(point))
        return HTHIDE;
	else
	{
		if(TRUE == m_biHide.bRaised)
		{
			m_biHide.bRaised = 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;
			SendMessage(WM_NCPAINT);
		}
	}

	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);
}

BOOL CAHFloatWnd::OnNcActivate(BOOL bActive) 
{
	if(!bActive)
	{
		ShowWindow(SW_HIDE);
	}
	
	return CWnd::OnNcActivate(bActive);
}


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) 
{
	ShowWindow (SW_HIDE);
	CWnd::OnTimer(nIDEvent);
}

void CAHFloatWnd::OnNcLButtonDown(UINT nHitTest, CPoint point) 
{
	BOOL bNeedPaint = FALSE;

    CWnd* pFocus = GetFocus();
    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);
}



//////////////////////////////////////////////////////////////////////////////////////////
// CHidePageItem
CHidePageItem::CHidePageItem()
{
}

CHidePageItem::~CHidePageItem()
{
}

void CHidePageItem::Draw(CDC *pDC, BOOL bHorz)
{
	::DrawIconEx(pDC->m_hDC,m_rect.left+3, m_rect.top + 3,m_hIcon,16,16,0,NULL,DI_NORMAL);
	CRect rect = m_rect;
	rect.left += 3;
	rect.top += 3;
	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-6, rect.top, ETO_CLIPPED, NULL, m_sText, NULL);
		}
		pDC->SetBkMode(nPrevBkMode);
	}
	if(TRUE == bHorz)
	{
		pDC->MoveTo (m_rect.right, m_rect.top );
		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, m_rect.bottom );
		}
		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 );
		}
		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;
	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_POPUP | WS_BORDER | WS_THICKFRAME|WS_VISIBLE), m_oldWndRect, 
			pWnd, 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 + 24;
				pHidePageItem->m_isActive = FALSE;
				if(m_nActivePage == i)
				{
					pHidePageItem->m_rect.right += 6;
					pHidePageItem->m_rect.right += pDC->GetTextExtent (pHidePageItem->m_sText).cx;
					pHidePageItem->m_rect.right += 26;
					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 + 24;
				pHidePageItem->m_isActive = FALSE;
				if(m_nActivePage == i)
				{
					pHidePageItem->m_rect.bottom += 6;
					pHidePageItem->m_rect.bottom += pDC->GetTextExtent (pHidePageItem->m_sText).cx;
					pHidePageItem->m_rect.bottom += 26;
					pHidePageItem->m_isActive = TRUE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -