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

📄 autohidebar.cpp

📁 主要用在管理系统,一个工程维护管理用vc++ 8.0 accesss数据库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		pHidePageItem = NULL;
		m_arrPags.RemoveAt(0);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CAutoHideBar implementation starts

CAutoHideBar::CAutoHideBar()
{
	m_pCurSelItem=NULL;
}

CAutoHideBar::~CAutoHideBar()
{
	POSITION	pos;
	CHideItem*	pHideItem;

	for(pos=m_listBars.GetHeadPosition();pos!=NULL;)
	{
		pHideItem = (CHideItem*)m_listBars.GetNext(pos);
		if(NULL != pHideItem)
		{
			pHideItem->RemoveAll ();
			delete pHideItem;
			pHideItem = NULL;
		}
	}
	m_listBars.RemoveAll ();
}


BEGIN_MESSAGE_MAP(CAutoHideBar, CControlBar)
	//{{AFX_MSG_MAP(CAutoHideBar)
	ON_MESSAGE(WM_SIZEPARENT, OnSizeParent)
	ON_WM_MOUSEMOVE()
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
	ON_WM_SHOWWINDOW()
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CAutoHideBar message handlers

BOOL CAutoHideBar::Create(CWnd *pParentWnd, DWORD dwStyle, UINT nID)
{
	ASSERT(pParentWnd != NULL);
	ASSERT_KINDOF(CFrameWnd, pParentWnd);

	m_dwStyle = (dwStyle & CBRS_ALL);
	// register and create the window 
    CString wndclass = ::AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,
        ::LoadCursor(NULL, IDC_ARROW),
        ::GetSysColorBrush(COLOR_BTNFACE), 0);

    dwStyle &= ~CBRS_ALL; // keep only the generic window styles
    dwStyle |= WS_CLIPCHILDREN; // prevents flashing

	if(m_dwStyle & CBRS_ORIENT_HORZ)
	{
		m_Font.CreateFont(13 ,0, 0,0, FW_NORMAL, 0,0,0, DEFAULT_CHARSET,
			OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 
			FF_ROMAN , "Tahoma");
	}
	else if(m_dwStyle & CBRS_ORIENT_VERT)
	{
		m_Font.CreateFont(13,0, -900,-900, FW_NORMAL, 0,0,0, DEFAULT_CHARSET,
			OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 
			FF_ROMAN , "Tahoma");
	}

	// Note: Parent must resize itself for control bar to be resized
	return CWnd::Create(wndclass, NULL, dwStyle, CRect(0, 0, 0, 0), pParentWnd, nID);
}

LRESULT CAutoHideBar::OnSizeParent(WPARAM wParam, LPARAM lParam)
{
	AFX_SIZEPARENTPARAMS* lpLayout = (AFX_SIZEPARENTPARAMS*)lParam;
	DWORD dwStyle = m_dwStyle;

	if(!(dwStyle & WS_VISIBLE))
	{
		SetWindowPos(NULL, 0, 0, 0, 0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_HIDEWINDOW);
	}

	if ((dwStyle & WS_VISIBLE) && (dwStyle & CBRS_ALIGN_ANY) != 0)
	{
		// align the control bar
		CRect rect;
		rect.CopyRect(&lpLayout->rect);

		CSize sizeAvail = rect.Size();  // maximum size available

		// get maximum requested size
		DWORD dwMode = lpLayout->bStretch ? LM_STRETCH : 0;
		if (dwStyle & CBRS_ORIENT_HORZ)
			dwMode |= LM_HORZ | LM_HORZDOCK;
		else
			dwMode |=  LM_VERTDOCK;

		CSize size (AUTO_HIDE_BAR_WIDTH,AUTO_HIDE_BAR_WIDTH);

		size.cx = min(size.cx, sizeAvail.cx);
		size.cy = min(size.cy, sizeAvail.cy);

		if (dwStyle & CBRS_ORIENT_HORZ)
		{
			lpLayout->sizeTotal.cy += size.cy;
			lpLayout->sizeTotal.cx = max(lpLayout->sizeTotal.cx, size.cx);
			if (dwStyle & CBRS_ALIGN_TOP)
				lpLayout->rect.top += size.cy;
			else if (dwStyle & CBRS_ALIGN_BOTTOM)
			{
				size.cy-=2; // Bottom alignment has different width from the Top alignment
				rect.top = rect.bottom - size.cy;
				lpLayout->rect.bottom -= size.cy;
			}
			rect.bottom = rect.top + size.cy;
			rect.right = lpLayout->rect.right;
		}
		else if (dwStyle & CBRS_ORIENT_VERT)
		{
			lpLayout->sizeTotal.cx += size.cx;
			lpLayout->sizeTotal.cy = max(lpLayout->sizeTotal.cy, size.cy);
			if (dwStyle & CBRS_ALIGN_LEFT)
				lpLayout->rect.left += size.cx;
			else if (dwStyle & CBRS_ALIGN_RIGHT)
			{
				rect.left = rect.right - size.cx;
				lpLayout->rect.right -= size.cx;
			}
			rect.right = rect.left + size.cx;
			rect.bottom = lpLayout->rect.bottom ;
		}
		else
		{
			ASSERT(FALSE);      // can never happen
		}
		m_size = CSize(rect.BottomRight() - rect.TopLeft());
		SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER|SWP_NOACTIVATE|SWP_SHOWWINDOW);
	}
	return 0;
}

void CAutoHideBar::OnMouseMove(UINT nFlags, CPoint point) 
{
	TRACKMOUSEEVENT trackEvt;
	trackEvt.cbSize=sizeof(TRACKMOUSEEVENT);
	trackEvt.dwFlags=TME_LEAVE|TME_HOVER;
	trackEvt.dwHoverTime=AUTO_HIDE_DELAY_TIMES;
	trackEvt.hwndTrack=m_hWnd;
	_TrackMouseEvent(&trackEvt);

	CControlBar::OnMouseMove(nFlags, point);
}

void CAutoHideBar::OnPaint() 
{
	CPaintDC PaintDC(this); // device context for painting
	
	CRect rcBar;
	GetClientRect(&rcBar);
	CDC	dc;
	dc.CreateCompatibleDC(&PaintDC);

	CBitmap bm;
	bm.CreateCompatibleBitmap(&PaintDC, rcBar.Width(), rcBar.Height());
	dc.SelectObject(bm);
	//dc.SetBoundsRect(&rcBar, DCB_DISABLE);

    // draw background
	CBrush brush(RGB(247,243,233));
    dc.FillRect(&rcBar, &brush);
	CPen pen(PS_SOLID,1,RGB(128,128,128)),*pOldPen=dc.SelectObject(&pen);
	dc.Rectangle(&rcBar);
	dc.SelectObject(pOldPen);

	dc.SelectObject (m_Font);

	//COLORREF crOldText;
	//crOldText = dc.SetTextColor(RGB(128,128,128));

	UpDateSize();
	DrawItem(&dc);
	//dc.SetTextColor(crOldText);

	PaintDC.BitBlt (rcBar.left, rcBar.top, rcBar.Width(), rcBar.Height(), &dc, 0,0,SRCCOPY);
	dc.DeleteDC ();
}

void CAutoHideBar::DrawItem(CDC *pDC)
{
	POSITION	pos;
	CHideItem* pHideItem;

	for(pos=m_listBars.GetHeadPosition();pos!=NULL;)
	{
		pHideItem = (CHideItem*)m_listBars.GetNext(pos);;
		if(NULL != pHideItem)
			pHideItem->Draw (pDC);
	}
}

void CAutoHideBar::HidePageBar(CDockPageBar *pDockPageBar)
{
	m_dwStyle |= WS_VISIBLE;
	CHideItem* pHideItem = new CHideItem;
	
	pHideItem->AddPageItem(pDockPageBar, this, m_dwStyle);

	m_listBars.AddTail (pHideItem);
	Invalidate();
}

void CAutoHideBar::UpDateSize()
{
	CPaintDC dc(this);
	dc.SelectObject (m_Font);

	CRect rect;
	GetClientRect(&rect);

	if(m_dwStyle & CBRS_ORIENT_HORZ)
	{
		rect.left += 2;
		if (m_dwStyle & CBRS_ALIGN_TOP)
			rect.bottom -= 3;
		else if (m_dwStyle & CBRS_ALIGN_BOTTOM)
			rect.top += 2;

	}
	else if(m_dwStyle & CBRS_ORIENT_VERT)
	{
		rect.top += 2;
		if (m_dwStyle & CBRS_ALIGN_LEFT)
			rect.right -= 3;
		else if (m_dwStyle & CBRS_ALIGN_RIGHT)
			rect.left += 2;
	}
	else
	{
		ASSERT(FALSE);      // can never happen
	}

	POSITION	pos;
	CHideItem* pHideItem;

	for(pos=m_listBars.GetHeadPosition();pos!=NULL;)
	{
		pHideItem = (CHideItem*)m_listBars.GetNext(pos);;
		if(NULL != pHideItem)
		{
			pHideItem->UpDateSize (&dc, &rect);
			if(m_dwStyle & CBRS_ORIENT_HORZ)
			{
				rect.left += 20;
			}
			else if(m_dwStyle & CBRS_ORIENT_VERT)
			{
				rect.top += 20;
			}
		}
	}
}

void CAutoHideBar::GetClientRect(CRect *rect)
{
	CWnd::GetClientRect (rect);
	if(m_dwStyle & CBRS_ORIENT_HORZ)
	{
		if (m_dwStyle & CBRS_ALIGN_TOP)
			rect->bottom -= 1;
	}
	else if(m_dwStyle & CBRS_ORIENT_VERT)
	{
		if (m_dwStyle & CBRS_ALIGN_LEFT)
			rect->right -= 1;
	}
	else
	{
		ASSERT(FALSE);      // can never happen
	}
}

void CAutoHideBar::UpdateBar()
{
	POSITION	pos, pos2;
	CHideItem* pHideItem;
	

	for(pos=m_listBars.GetHeadPosition();( pos2 = pos ) != NULL;)
	{
		pHideItem = (CHideItem*)m_listBars.GetNext(pos);;
		if(NULL != pHideItem)
		{
			if(pHideItem->m_arrPags.GetSize () == 0)
			{
				delete pHideItem;
				pHideItem = NULL;
				m_listBars.RemoveAt(pos2);
			}
		}
	}
	if(m_listBars.GetCount () == 0)
	{
		m_dwStyle &= ~WS_VISIBLE;
	}
	Invalidate ();
	GetParentFrame()->RecalcLayout();
}
void CAutoHideBar::OnShowWindow(BOOL bShow, UINT nStatus)
{
	CControlBar::OnShowWindow(bShow, nStatus);

	// TODO: Add your message handler code here
}

LRESULT CAutoHideBar::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
	case WM_MOUSELEAVE:
		if(m_pCurSelItem){
			m_pCurSelItem->m_wndFloat.m_bCursorInAutoHideBarItem=FALSE;
			m_pCurSelItem=NULL;
		}
		break;
	case WM_MOUSEHOVER:
	case WM_LBUTTONDOWN:
		{
			POSITION	pos;
			CHideItem*	pHideItem;

			CPoint point;
			GetCursorPos(&point);
			ScreenToClient(&point);

			for(pos=m_listBars.GetHeadPosition();pos!=NULL;)
			{
				pHideItem = (CHideItem*)m_listBars.GetNext(pos);
				if(NULL != pHideItem)
				{
					if(pHideItem->m_rect.PtInRect (point))
					{
						pHideItem->OnMouseMove (point);
						pHideItem->m_wndFloat.m_bCursorInAutoHideBarItem=TRUE;
						m_pCurSelItem=pHideItem;
					}else{
						pHideItem->m_wndFloat.m_bCursorInAutoHideBarItem=FALSE;
						m_pCurSelItem=NULL;
					}
				}
			}		
			Invalidate(FALSE);	
		}
		break;
	default:
		break;
	}
	return CControlBar::WindowProc(message, wParam, lParam);
}
 void CAutoHideBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
 {
 }
//CAutoHideBar implementation ends
//////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////
// CAutoHideFrame

const DWORD dwHideBarMap[4][2] =
{
	{ AHBRS_TOP,      CBRS_TOP    },
	{ AHBRS_BOTTOM,   CBRS_BOTTOM },
	{ AHBRS_LEFT,     CBRS_LEFT   },
	{ AHBRS_RIGHT,    CBRS_RIGHT  },
};

IMPLEMENT_DYNCREATE(CAutoHideFrame, CFrameWnd)

CAutoHideFrame::CAutoHideFrame()
{
}

CAutoHideFrame::~CAutoHideFrame()
{

}

BEGIN_MESSAGE_MAP(CAutoHideFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CAutoHideFrame)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAutoHideFrame message handlers

void CAutoHideFrame::EnableDocking(DWORD dwDockStyle)
{
	// must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only
	ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);

	for (int i = 0; i < 4; i++)
	{
		if (dwHideBarMap[i][1] & dwDockStyle & CBRS_ALIGN_ANY)
		{
			CAutoHideBar* pAutoHide = (CAutoHideBar*)GetControlBar(dwHideBarMap[i][0]);
			if (pAutoHide == NULL)
			{
				pAutoHide = new CAutoHideBar;
				if (!pAutoHide->Create(this,
					WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE |
					dwHideBarMap[i][1], dwHideBarMap[i][0]))
				{
					AfxThrowResourceException();
				}
			}
		}
	}
	CFrameWnd::EnableDocking(dwDockStyle);
}
void CAutoHideFrame::OnDestroy()
{
	for (int i = 0; i < 4; i++)
	{
		CAutoHideBar* pAutoHide = (CAutoHideBar*)GetControlBar(dwHideBarMap[i][0]);
		if (pAutoHide != NULL)
		{
			pAutoHide->DestroyWindow();
			delete pAutoHide;
		}
	}
	CFrameWnd::OnDestroy();
}

void  CAutoHideFrame::GetPureClientRect(LPRECT lpRect)
{
	::GetWindowRect(((CFrameWnd*)this)->GetActiveView()->m_hWnd,lpRect);
}
void CAutoHideFrame::BringClientWindowToBottom()
{
	CWnd *pWnd=GetActiveView();
	pWnd->SetWindowPos(&CWnd::wndBottom ,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);	
}

//////////////////////////////////////////////////////////////////////////
//CMDIAutoHideFrame Implementation starts
IMPLEMENT_DYNCREATE(CMDIAutoHideFrame, CMDIFrameWnd)

CMDIAutoHideFrame::CMDIAutoHideFrame()
{
}

CMDIAutoHideFrame::~CMDIAutoHideFrame()
{

}


BEGIN_MESSAGE_MAP(CMDIAutoHideFrame,CMDIFrameWnd)
	//{{AFX_MSG_MAP(CMDIAutoHideFrame)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMDIAutoHideFrame message handlers

void CMDIAutoHideFrame::EnableDocking(DWORD dwDockStyle)
{
	// must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only
	ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);

	for (int i = 0; i < 4; i++)
	{
		if (dwHideBarMap[i][1] & dwDockStyle & CBRS_ALIGN_ANY)
		{
			CAutoHideBar* pAutoHide = (CAutoHideBar*)GetControlBar(dwHideBarMap[i][0]);
			if (pAutoHide == NULL)
			{
				pAutoHide = new CAutoHideBar;
				if (!pAutoHide->Create(this,
					WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE |
					dwHideBarMap[i][1], dwHideBarMap[i][0]))
				{
					AfxThrowResourceException();
				}
			}
		}
	}
	CMDIFrameWnd::EnableDocking(dwDockStyle);
}

void  CMDIAutoHideFrame::GetPureClientRect(LPRECT lpRect)
{
	::GetWindowRect(((CMDIFrameWnd*)this)->m_hWndMDIClient,lpRect);
}

void CMDIAutoHideFrame::BringClientWindowToBottom()
{
	CWnd *pWnd=CWnd::FromHandle(m_hWndMDIClient);
	pWnd->SetWindowPos(&CWnd::wndBottom ,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);	
}

void CMDIAutoHideFrame::OnDestroy()
{
	for (int i = 0; i < 4; i++)
	{
		CAutoHideBar* pAutoHide = (CAutoHideBar*)GetControlBar(dwHideBarMap[i][0]);
		if (pAutoHide != NULL)
		{
			pAutoHide->DestroyWindow();
			delete pAutoHide;
		}
	}
	CMDIFrameWnd::OnDestroy();
}
//////////////////////////////////////////////////////////////////////////
//CMDIAutoHideFrame implementation ends

⌨️ 快捷键说明

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