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

📄 buttonslist.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
BOOL CButtonsList::SelectButton (int iImage)
{
	if (iImage < 0)
	{
		SelectButton ((CBCGPToolbarButton*) NULL);
		return TRUE;
	}

	for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL;)
	{
		CBCGPToolbarButton* pListButton = (CBCGPToolbarButton*) m_Buttons.GetNext (pos);
		ASSERT (pListButton != NULL);

		if (pListButton->GetImage () == iImage)
		{
			SelectButton (pListButton);
			return TRUE;
		}
	}

	return FALSE;
}
//********************************************************************************
void CButtonsList::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* /*pScrollBar*/)
{
	int iScrollOffset = m_iScrollOffset;

	switch (nSBCode)
	{
	case SB_TOP:
		iScrollOffset = 0;
		break;

	case SB_BOTTOM:
		iScrollOffset = m_iScrollTotal;
		break;

	case SB_LINEUP:
		iScrollOffset -= m_sizeButton.cy + iYOffset;
		break;

	case SB_LINEDOWN:
		iScrollOffset += m_sizeButton.cy + iYOffset;
		break;

	case SB_PAGEUP:
		iScrollOffset -= m_iScrollPage * (m_sizeButton.cy + iYOffset);
		break;

	case SB_PAGEDOWN:
		iScrollOffset += m_iScrollPage * (m_sizeButton.cy + iYOffset);
		break;

	case SB_THUMBPOSITION:
		iScrollOffset = ((m_sizeButton.cy + iYOffset) / 2 + nPos) / 
			(m_sizeButton.cy + iYOffset) * (m_sizeButton.cy + iYOffset);
		break;

	default:
		return;
	}

	iScrollOffset = min (m_iScrollTotal, max (iScrollOffset, 0));

	if (iScrollOffset != m_iScrollOffset)
	{
		m_iScrollOffset = iScrollOffset;
		SetScrollPos (SB_VERT, m_iScrollOffset);

		CRect rectClient;	// Client area rectangle
		GetClientRect (&rectClient);

		rectClient.right -= ::GetSystemMetrics (SM_CXVSCROLL) + 2;
		rectClient.InflateRect (-1, -1);

		InvalidateRect (rectClient);
	}
}
//********************************************************************************
CScrollBar* CButtonsList::GetScrollBarCtrl(int nBar) const
{
	if (nBar == SB_HORZ || m_wndScrollBar.GetSafeHwnd () == NULL)
	{
		return NULL;
	}

	return (CScrollBar* ) &m_wndScrollBar;
}
//********************************************************************************
void CButtonsList::OnEnable(BOOL bEnable) 
{
	CButton::OnEnable(bEnable);
	
	for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL;)
	{
		CBCGPToolbarButton* pListButton = (CBCGPToolbarButton*) m_Buttons.GetNext (pos);
		ASSERT (pListButton != NULL);

	}

	Invalidate ();
	UpdateWindow ();
}
//********************************************************************************
void CButtonsList::OnSysColorChange() 
{
	if (m_pImages == NULL)
	{
		return;
	}

	m_pImages->OnSysColorChange ();

	Invalidate ();
	UpdateWindow ();
}
//*********************************************************************************
void CButtonsList::RebuildLocations ()
{
	if (GetSafeHwnd () == NULL || m_Buttons.IsEmpty ())
	{
		return;
	}

	CRect rectClient;
	GetClientRect (&rectClient);

	CRect rectButtons = rectClient;

	rectButtons.right -= ::GetSystemMetrics (SM_CXVSCROLL) + 1;
	rectButtons.InflateRect (-iXOffset, -iYOffset);

	int x = rectButtons.left;
	int y = rectButtons.top - m_iScrollOffset;

	CClientDC dc (this);

	for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL;)
	{
		CBCGPToolbarButton* pButton = (CBCGPToolbarButton*) m_Buttons.GetNext (pos);
		ASSERT (pButton != NULL);

		CSize sizeButton = pButton->OnCalculateSize (&dc, m_sizeButton, TRUE);

		if (x + sizeButton.cx > rectButtons.right)
		{
			if (x == rectButtons.left)
			{
				sizeButton.cx = rectButtons.right - rectButtons.left;
			}
			else
			{
				x = rectButtons.left;
				y += sizeButton.cy + iYOffset;
			}
		}

		pButton->SetRect (CRect (CPoint (x, y), 
			CSize (sizeButton.cx, m_sizeButton.cy)));

		x += sizeButton.cx + iXOffset;
	}

	CBCGPToolbarButton* pLastButton = (CBCGPToolbarButton*) m_Buttons.GetTail ();
	ASSERT (pLastButton != NULL);

	int iVisibleRows = rectButtons.Height () / (m_sizeButton.cy + iYOffset);
	int iTotalRows = pLastButton->Rect ().bottom / (m_sizeButton.cy + iYOffset);

	int iNonVisibleRows = iTotalRows - iVisibleRows;
	if (iNonVisibleRows > 0)	// Not enouth space.
	{
		if (m_wndScrollBar.GetSafeHwnd () == NULL)
		{
			CRect rectSB;
			GetClientRect (&rectSB);

			rectSB.InflateRect (-1, -1);
			rectSB.left = rectSB.right - ::GetSystemMetrics (SM_CXVSCROLL) - 1;

			m_wndScrollBar.Create (WS_CHILD | WS_VISIBLE | SBS_VERT,
									rectSB, this, 1);
		}
		
		m_iScrollTotal = iNonVisibleRows * (m_sizeButton.cy + iYOffset);
		m_iScrollPage = iVisibleRows;

		SetScrollRange (SB_VERT, 0, m_iScrollTotal);
	}

	m_bInited = TRUE;
}
//*********************************************************************************
void CButtonsList::OnSize(UINT nType, int cx, int cy) 
{
	CButton::OnSize(nType, cx, cy);
	RebuildLocations ();
}
//*********************************************************************************
HBRUSH CButtonsList::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CWnd::OnCtlColor (pDC, pWnd, nCtlColor);

	for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL;)
	{
		CBCGPToolbarButton* pButton = (CBCGPToolbarButton*) m_Buttons.GetNext (pos);
		ASSERT_VALID (pButton);

		HWND hwdList = pButton->GetHwnd ();
		if (hwdList == NULL)	// No control
		{
			continue;
		}

		if (hwdList == pWnd->GetSafeHwnd () ||
			::IsChild (hwdList, pWnd->GetSafeHwnd ()))
		{
			HBRUSH hbrButton = pButton->OnCtlColor (pDC, nCtlColor);
			return (hbrButton == NULL) ? hbr : hbrButton;
		}
	}

	return hbr;
}
//*********************************************************************************
UINT CButtonsList::OnGetDlgCode() 
{
	return DLGC_WANTARROWS;
}
//*********************************************************************************
void CButtonsList::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	switch (nChar)
	{
	case VK_LEFT:
	case VK_UP:
		if (m_pSelButton != NULL)
		{
			POSITION pos = m_Buttons.Find (m_pSelButton);
			if (pos != NULL)
			{
				m_Buttons.GetPrev (pos);
				if (pos != NULL)
				{
					SelectButton ((CBCGPToolbarButton*) m_Buttons.GetAt (pos));
				}
			}
		}
		else if (!m_Buttons.IsEmpty ())
		{
			SelectButton ((CBCGPToolbarButton*) m_Buttons.GetHead ());
		}

		return;

	case VK_RIGHT:
	case VK_DOWN:
		if (m_pSelButton != NULL)
		{
			POSITION pos = m_Buttons.Find (m_pSelButton);
			if (pos != NULL)
			{
				m_Buttons.GetNext (pos);
				if (pos != NULL)
				{
					SelectButton ((CBCGPToolbarButton*) m_Buttons.GetAt (pos));
				}
			}
		}
		else if (!m_Buttons.IsEmpty ())
		{
			SelectButton ((CBCGPToolbarButton*) m_Buttons.GetHead ());
		}
		return;

	case VK_HOME:
		if (!m_Buttons.IsEmpty ())
		{
			SelectButton ((CBCGPToolbarButton*) m_Buttons.GetHead ());
		}
		return;

	case VK_END:
		if (m_Buttons.IsEmpty ())
		{
			SelectButton ((CBCGPToolbarButton*) m_Buttons.GetTail ());
		}
		return;
	}			
	
	CButton::OnKeyDown(nChar, nRepCnt, nFlags);
}
//*********************************************************************************
void CButtonsList::OnSetFocus(CWnd* /*pOldWnd*/) 
{
	m_bFocused = TRUE;

	if (m_pSelButton == NULL && !m_Buttons.IsEmpty ())
	{
		SelectButton ((CBCGPToolbarButton*) m_Buttons.GetHead ());
	}

	RedrawSelection ();
}
//*********************************************************************************
void CButtonsList::OnKillFocus(CWnd* /*pNewWnd*/) 
{
	m_bFocused = FALSE;
	RedrawSelection ();
}
//*********************************************************************************
void CButtonsList::RedrawSelection ()
{
	if (m_pSelButton == NULL)
	{
		return;
	}

	CRect rect = m_pSelButton->Rect ();
	rect.OffsetRect (0, -m_iScrollOffset);

	rect.InflateRect (2, 2);

	InvalidateRect (rect);
	UpdateWindow ();
}

#endif // BCG_NO_CUSTOMIZATION

⌨️ 快捷键说明

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