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