📄 macsliderctrl.cpp
字号:
// No points on the thumb.
if (dwStyle & TBS_BOTH)
{
pDC->RoundRect(rc, CPoint(2, 2));
rc.DeflateRect(1, 1, 1, 1);
pDC->Draw3dRect(rc, m_crThumbLight, m_crThumbDark);
pDC->SetPixel(rc.left, rc.top, m_crThumbLighter);
pDC->SetPixel(rc.right - 1, rc.top, m_crThumb);
pDC->SetPixel(rc.right - 1, rc.bottom - 1, m_crThumbDarker);
pDC->SetPixel(rc.left, rc.bottom - 1, m_crThumb);
}
// Point is on left side.
else if (dwStyle & TBS_TOP)
{
pDC->MoveTo(rc.left + nMid - 1, rc.top);
pDC->LineTo(rc.left, rc.top + nMid - 1);
pDC->LineTo(rc.left, rc.bottom - nMid);
pDC->LineTo(rc.left + nMid - 1, rc.bottom - 1);
pDC->LineTo(rc.right - 2, rc.bottom - 1);
pDC->LineTo(rc.right - 1, rc.bottom - 2);
pDC->LineTo(rc.right - 1, rc.top + 1);
pDC->LineTo(rc.right - 2, rc.top);
pDC->LineTo(rc.left + nMid - 2, rc.top);
pDC->FloodFill(rc.left + nMid, rc.top + nMid, ::GetSysColor(COLOR_WINDOWFRAME));
pDC->SelectObject(&m_penThumbLighter);
pDC->MoveTo(rc.left + 1, rc.top + nMid - 1);
pDC->LineTo(rc.left + nMid, rc.top);
pDC->SelectObject(&m_penThumbLight);
pDC->MoveTo(rc.left + 1, rc.top + nMid + 1);
pDC->LineTo(rc.left + 1, rc.top + nMid - 1);
pDC->MoveTo(rc.left + nMid, rc.top + 1);
pDC->LineTo(rc.right - 2, rc.top + 1);
pDC->SelectObject(&m_penThumbDark);
pDC->MoveTo(rc.left + 2, rc.bottom - nMid + 1);
pDC->LineTo(rc.left + nMid - 1, rc.bottom - 2);
pDC->LineTo(rc.right - 2, rc.bottom - 2);
pDC->LineTo(rc.right - 2, rc.top + 1);
rc.DeflateRect(2, 1, 0, 0);
} // if point on left side
// Point is on right side.
else
{
pDC->MoveTo(rc.left, rc.top + 1);
pDC->LineTo(rc.left, rc.bottom - 2);
pDC->LineTo(rc.left + 1, rc.bottom - 1);
pDC->LineTo(rc.right - nMid, rc.bottom - 1);
pDC->LineTo(rc.right - 1, rc.bottom - nMid);
pDC->LineTo(rc.right - 1, rc.top + nMid - 1);
pDC->LineTo(rc.right - nMid, rc.top);
pDC->LineTo(rc.left, rc.top);
pDC->FloodFill(rc.left + nMid, rc.top + nMid, ::GetSysColor(COLOR_WINDOWFRAME));
pDC->SelectObject(&m_penThumbLight);
pDC->MoveTo(rc.left + 1, rc.bottom - 2);
pDC->LineTo(rc.left + 1, rc.top + 1);
pDC->LineTo(rc.right - nMid + 1, rc.top + 1);
pDC->SetPixel(rc.left + 1, rc.top + 1, m_crThumbLighter);
pDC->SelectObject(&m_penThumbDark);
pDC->MoveTo(rc.left + 2, rc.bottom - 2);
pDC->LineTo(rc.right - nMid, rc.bottom - 2);
pDC->MoveTo(rc.right - 2, rc.top + nMid);
pDC->LineTo(rc.right - 2, rc.top + nMid - 1);
pDC->LineTo(rc.right - nMid, rc.top + 1);
pDC->SelectObject(&m_penThumbDarker);
pDC->MoveTo(rc.right - nMid, rc.bottom - 2);
pDC->LineTo(rc.right - 1, rc.bottom - nMid - 1);
rc.DeflateRect(0, 1, 1, 0);
} // if point is on right side
// Only draw the gripper if the slider is enabled.
if (IsWindowEnabled())
{
if (nHeight > 5)
{
pDC->SelectObject(&m_penThumbLight);
pDC->MoveTo(rc.left + 5, rc.top + 1);
pDC->LineTo(rc.right - 5, rc.top + 1);
pDC->MoveTo(rc.left + 5, rc.top + 3);
pDC->LineTo(rc.right - 5, rc.top + 3);
if (nHeight > 9)
{
pDC->MoveTo(rc.left + 5, rc.top + 5);
pDC->LineTo(rc.right - 5, rc.top + 5);
pDC->MoveTo(rc.left + 5, rc.top + 7);
pDC->LineTo(rc.right - 5, rc.top + 7);
}
}
if (nHeight > 5)
{
pDC->SelectObject(&m_penThumbDarker);
pDC->MoveTo(rc.left + 5, rc.top + 2);
pDC->LineTo(rc.right - 4, rc.top + 2);
pDC->MoveTo(rc.left + 5, rc.top + 4);
pDC->LineTo(rc.right - 4, rc.top + 4);
if (nHeight > 9)
{
pDC->MoveTo(rc.left + 5, rc.top + 6);
pDC->LineTo(rc.right - 4, rc.top + 6);
}
}
if (nHeight > 5)
{
pDC->SetPixel(rc.left + 4, rc.top + 1, m_crThumbLighter);
pDC->SetPixel(rc.left + 4, rc.top + 3, m_crThumbLighter);
if (nHeight > 9)
{
pDC->SetPixel(rc.left + 4, rc.top + 5, m_crThumbLighter);
pDC->SetPixel(rc.left + 4, rc.top + 7, m_crThumbLighter);
}
}
} // if (IsWindowEnabled())
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
} // DrawVerticalThumb
//-------------------------------------------------------------------
//
void CMacSliderCtrl::DrawChannel(CDC *pDC, const CRect &rect, BOOL bHorz)
//
// Return Value: None.
//
// Parameters : pDC - Specifies a device context.
// rect - The rectangle for the channel.
// bHorz - TRUE if the slider is horizontal; FALSE otherwise.
//
// Remarks : Draws the slider's channel and selection, if any.
//
{
CRect rc(rect);
// If the slider has a selection, shrink the rect a little.
int nRangeMin = GetRangeMin();
int nRangeMax = GetRangeMax();
if (nRangeMin || nRangeMax)
rc.InflateRect(0, -1, 0, -1);
// Another minor adjustment for the rect.
if (bHorz)
rc.InflateRect(-1, 0, -1, 1);
else
rc.InflateRect(0, -1, 0, -1);
CPen *pOldPen = pDC->SelectObject(&m_penDkShadow);
CBrush br(m_crChannel);
CBrush *pOldBrush = pDC->SelectObject(&br);
// If the height or width is > 3, draw the inner round rect.
if ((bHorz && rc.Height() > 3) || (!bHorz && rc.Width() > 3))
pDC->RoundRect(rc, CPoint(2, 2));
rc.InflateRect(1, 1, 1, 0);
// Give it a sunken appearance.
pDC->SelectObject(&m_penShadow);
pDC->MoveTo(rc.left, rc.bottom - 2);
pDC->LineTo(rc.left, rc.top + 2);
pDC->LineTo(rc.left + 2, rc.top);
pDC->LineTo(rc.right - 2, rc.top);
pDC->SelectObject(&m_penHilight);
pDC->MoveTo(rc.left + 1, rc.bottom - 1);
pDC->LineTo(rc.left + 2, rc.bottom);
pDC->LineTo(rc.right - 2, rc.bottom);
pDC->LineTo(rc.right - 2, rc.bottom - 1);
pDC->LineTo(rc.right - 1, rc.bottom - 1);
pDC->LineTo(rc.right - 1, rc.top + 2);
pDC->LineTo(rc.right - 3, rc.top);
// Draw the selection, if there is one.
int nSelMin, nSelMax;
GetSelection(nSelMin, nSelMax);
if (nSelMin < nSelMax)
{
CRect rcSel(rect);
int nAdjust = (bHorz ? rect.Width() : rect.Height());
int nStart = int(((float)nAdjust * float(nSelMin - nRangeMin)) / float(nRangeMax - nRangeMin));
int nEnd = int(((float)nAdjust * float(nSelMax - nRangeMin)) / float(nRangeMax - nRangeMin));
if (bHorz)
{
rcSel.left += nStart;
rcSel.right = rcSel.left + (nEnd - nStart);
}
else
{
rcSel.top += nStart;
rcSel.bottom = rcSel.top + (nEnd - nStart);
}
if (bHorz)
rcSel.DeflateRect(2, 2, 2, 1);
else
rcSel.DeflateRect(1, 2, 1, 2);
CBrush br2(m_crSelection);
pDC->FillRect(rcSel, &br2);
}
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
} // DrawChannel
//-------------------------------------------------------------------
//
void CMacSliderCtrl::GetColors()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Calculates the lighter and darker colors, as well as
// the shadow colors.
//
{
m_crThumbLight = LightenColor(m_crThumb, 51);
m_crThumbLighter = LightenColor(m_crThumbLight, 51);
m_crThumbDark = DarkenColor(m_crThumb, 51);
m_crThumbDarker = DarkenColor(m_crThumbDark, 51);
m_crHilight = ::GetSysColor(COLOR_3DHILIGHT);
// Get a color halfway between COLOR_3DSHADOW AND COLOR_3DFACE,
// and COLOR_3DDKSHADOW and COLOR_3DSHADOW.
COLORREF crFace = ::GetSysColor(COLOR_3DFACE);
COLORREF crShadow = ::GetSysColor(COLOR_3DSHADOW);
COLORREF crDkShadow = ::GetSysColor(COLOR_3DDKSHADOW);
BYTE byRedFace = GetRValue(crFace);
BYTE byRedShadow = GetRValue(crShadow);
BYTE byRedDkShadow = GetRValue(crDkShadow);
BYTE byGreenFace = GetGValue(crFace);
BYTE byGreenShadow = GetGValue(crShadow);
BYTE byGreenDkShadow = GetGValue(crDkShadow);
BYTE byBlueFace = GetBValue(crFace);
BYTE byBlueShadow = GetBValue(crShadow);
BYTE byBlueDkShadow= GetBValue(crDkShadow);
m_crShadow = RGB(byRedFace + ((byRedShadow - byRedFace) >> 1),
byGreenFace + ((byGreenShadow - byGreenFace) >> 1),
byBlueFace + ((byBlueShadow - byBlueFace) >> 1));
m_crDkShadow = RGB(byRedShadow + ((byRedDkShadow - byRedShadow) >> 1),
byGreenShadow + ((byGreenDkShadow - byGreenShadow) >> 1),
byBlueShadow + ((byBlueDkShadow - byBlueShadow) >> 1));
} // GetColors
//-------------------------------------------------------------------
//
void CMacSliderCtrl::CreatePens()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Deletes the pen objects, if necessary, and creates them.
//
{
DeletePens();
m_penThumbLight.CreatePen(PS_SOLID, 1, m_crThumbLight);
m_penThumbLighter.CreatePen(PS_SOLID, 1, m_crThumbLighter);
m_penThumb.CreatePen(PS_SOLID, 1, m_crThumb);
m_penThumbDark.CreatePen(PS_SOLID, 1, m_crThumbDark);
m_penThumbDarker.CreatePen(PS_SOLID, 1, m_crThumbDarker);
m_penDkShadow.CreatePen(PS_SOLID, 1, m_crDkShadow);
m_penShadow.CreatePen(PS_SOLID, 1, m_crShadow);
m_penHilight.CreatePen(PS_SOLID, 1, m_crHilight);
} // CreatePens
//-------------------------------------------------------------------
//
void CMacSliderCtrl::DeletePens()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Deletes the pen objects.
//
{
if (m_penThumbLight.m_hObject)
m_penThumbLight.DeleteObject();
if (m_penThumbLighter.m_hObject)
m_penThumbLighter.DeleteObject();
if (m_penThumb.m_hObject)
m_penThumb.DeleteObject();
if (m_penThumbDark.m_hObject)
m_penThumbDark.DeleteObject();
if (m_penThumbDarker.m_hObject)
m_penThumbDarker.DeleteObject();
if (m_penDkShadow.m_hObject)
m_penDkShadow.DeleteObject();
if (m_penShadow.m_hObject)
m_penShadow.DeleteObject();
if (m_penHilight.m_hObject)
m_penHilight.DeleteObject();
} // DeletePens
//-------------------------------------------------------------------
//
void CMacSliderCtrl::SetChannelColor(COLORREF crColor)
//
// Return Value: None.
//
// Parameters : crColor - The new channel color.
//
// Remarks : Sets the channel color.
//
{
m_crChannel = crColor;
GetColors();
CreatePens();
} // SetChannelColor
//-------------------------------------------------------------------
//
COLORREF CMacSliderCtrl::GetChannelColor()
//
// Return Value: The current channel color.
//
// Parameters : None.
//
// Remarks : Returns the current channel color.
//
{
return m_crChannel;
} // GetChannelColor
//-------------------------------------------------------------------
//
void CMacSliderCtrl::SetThumbColor(COLORREF crColor)
//
// Return Value: None.
//
// Parameters : crColor - The new thumb color.
//
// Remarks : Sets the channel color.
//
{
m_crThumb = crColor;
GetColors();
CreatePens();
RedrawWindow();
} // SetThumbColor
//-------------------------------------------------------------------
//
COLORREF CMacSliderCtrl::GetThumbColor()
//
// Return Value: The current thumb color.
//
// Parameters : None.
//
// Remarks : Returns the current thumb color.
//
{
return m_crThumb;
} // GetThumbColor
//-------------------------------------------------------------------
//
void CMacSliderCtrl::SetSelectionColor(COLORREF crColor)
//
// Return Value: None.
//
// Parameters : crColor - The new selection color.
//
// Remarks : Sets the selection color.
//
{
m_crSelection = crColor;
GetColors();
CreatePens();
RedrawWindow();
} // SetSelectionColor
//-------------------------------------------------------------------
//
COLORREF CMacSliderCtrl::GetSelectionColor()
//
// Return Value: The current selection color.
//
// Parameters : None.
//
// Remarks : Returns the current selection color.
//
{
return m_crSelection;
} // GetSelectionColor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -