📄 autohidebar.cpp
字号:
/////////////////////////////////////////////////////////////////////////
//
// 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 + -