roundsliderctrl.cpp
来自「完整的MP3播放器源码」· C++ 代码 · 共 749 行 · 第 1/2 页
CPP
749 行
const CPoint ptText = CPoint(m_ptCenter.x - szExtent.cx/2, m_ptCenter.x - szExtent.cy/2);
int oldTextColor = pDC->SetTextColor(m_crText);
pDC->SetBkMode(TRANSPARENT);
if(!IsWindowEnabled())
{
pDC->DrawState(ptText, szExtent, strFormattedText, DSS_DISABLED, TRUE, 0,
(HBRUSH)NULL);
}
else
{
//pDC->TextOut(ptText.x, ptText.y, strFormattedText);
}
// clean up
pDC->SelectObject(pOldFont);
pDC->SetTextColor(oldTextColor);
}
// Don't call CSliderCtrl::OnPaint()
}
void CRoundSliderCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
if(!m_bDragging)
{
m_bDragging = true;
m_bDragChanged = false;
SetCapture();
SetFocus();
if(SetKnob(point))
{
m_bDragChanged = true;
PostMessageToParent(TB_THUMBTRACK);
}
RedrawWindow();
}
else
{
CSliderCtrl::OnLButtonDown(nFlags, point);
}
}
void CRoundSliderCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_bDragging)
{
if(SetKnob(point))
{
m_bDragChanged = true;
PostMessageToParent(TB_THUMBTRACK);
RedrawWindow();
}
}
else
{
CSliderCtrl::OnMouseMove(nFlags, point);
}
}
void CRoundSliderCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_bDragging)
{
m_bDragging = false;
::ReleaseCapture();
if(SetKnob(point))
{
PostMessageToParent(TB_THUMBTRACK);
m_bDragChanged = true;
}
if(m_bDragChanged)
{
PostMessageToParent(TB_THUMBPOSITION);
m_bDragChanged = false;
}
RedrawWindow();
}
else
{
CSliderCtrl::OnLButtonUp(nFlags, point);
}
}
bool CRoundSliderCtrl::SetKnob(const CPoint& pt)
{
const int nMin = GetRangeMin();
const int nMax = GetRangeMax()+1;
CSize szDelta = pt - m_ptCenter;
if(m_bInverted) szDelta.cx *= -1;
double dNewPos = 0.0;
if(szDelta.cx != 0)
{
dNewPos = 90.0 - atan(-(double)szDelta.cy / (double)szDelta.cx) * 180.0 / pi;
}
if(((szDelta.cx == 0) && (szDelta.cy >= 0)) || (szDelta.cx < 0))
{
dNewPos += 180.0;
}
dNewPos -= m_nZero;
while(dNewPos < 0.0) dNewPos += 360.0;
while(dNewPos >= 360.0) dNewPos -= 360.0;
const int nNewPos = nMin + (int)(dNewPos*(nMax-nMin)/360.0);
const bool bChanged = (nNewPos != GetPos());
if(bChanged)
{
SetPos(nNewPos);
}
return bChanged;
}
void CRoundSliderCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
const int nMin = GetRangeMin();
const int nMax = GetRangeMax()+1;
switch(nChar)
{
case VK_LEFT:
case VK_UP:
{
int nNewPos = GetPos()-GetLineSize();
while(nNewPos < nMin) nNewPos += (nMax - nMin);
SetPos(nNewPos);
RedrawWindow();
PostMessageToParent(TB_LINEUP);
}
break;
case VK_RIGHT:
case VK_DOWN:
{
int nNewPos = GetPos()+GetLineSize();
while(nNewPos >= nMax) nNewPos -= (nMax - nMin);
SetPos(nNewPos);
RedrawWindow();
PostMessageToParent(TB_LINEDOWN);
}
break;
case VK_PRIOR:
{
int nNewPos = GetPos()-GetPageSize();
while(nNewPos < nMin) nNewPos += (nMax - nMin);
SetPos(nNewPos);
RedrawWindow();
PostMessageToParent(TB_PAGEUP);
}
break;
case VK_NEXT:
{
int nNewPos = GetPos()+GetPageSize();
while(nNewPos >= nMax) nNewPos -= (nMax - nMin);
SetPos(nNewPos);
RedrawWindow();
PostMessageToParent(TB_PAGEDOWN);
}
break;
case VK_HOME:
case VK_END:
// Do nothing (ignore keystroke)
break;
default:
CSliderCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}
}
void CRoundSliderCtrl::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_LEFT:
case VK_UP:
case VK_RIGHT:
case VK_DOWN:
case VK_PRIOR:
case VK_NEXT:
PostMessageToParent(TB_ENDTRACK);
break;
case VK_HOME:
case VK_END:
// Do nothing
break;
default:
CSliderCtrl::OnKeyUp(nChar, nRepCnt, nFlags);
}
}
void CRoundSliderCtrl::PostMessageToParent(const int nTBCode) const
{
CWnd* pWnd = GetParent();
if(pWnd) pWnd->PostMessage(WM_HSCROLL, (WPARAM)((GetPos() << 16) | nTBCode),
(LPARAM)GetSafeHwnd());
}
void CRoundSliderCtrl::SetText(const CString& strNewText)
{
m_strText = strNewText;
}
CString CRoundSliderCtrl::GetText() const
{
return m_strText;
}
void CRoundSliderCtrl::SetKnobRadius(const int nNewKnobRadius)
{
ASSERT(nNewKnobRadius > 4);
m_nKnobRadius = nNewKnobRadius;
}
int CRoundSliderCtrl::GetKnobRadius() const
{
return m_nKnobRadius;
}
void CRoundSliderCtrl::SetZero(const int nZero)
{
ASSERT(nZero >= 0 && nZero < 360);
m_nZero = nZero;
}
int CRoundSliderCtrl::GetZero() const
{
return m_nZero;
}
void CRoundSliderCtrl::SetInverted(const bool bNewInverted)
{
m_bInverted = bNewInverted;
}
bool CRoundSliderCtrl::GetInverted()
{
return m_bInverted;
}
// Overrideables
CString CRoundSliderCtrl::OnFormatText()
{
CString strFormattedText;
strFormattedText.Format(GetText(), GetPos());
return strFormattedText;
}
void CRoundSliderCtrl::ReconstructFont()
{
m_font.DeleteObject();
BOOL bCreated = m_font.CreateFontIndirect(&m_lf);
ASSERT(bCreated);
}
CRoundSliderCtrl& CRoundSliderCtrl::SetDialColor(COLORREF crBkgnd)
{
if (m_hDialBrush)
::DeleteObject(m_hDialBrush);
m_hDialBrush = ::CreateSolidBrush(crBkgnd);
return *this;
}
CRoundSliderCtrl& CRoundSliderCtrl::SetKnobColor(COLORREF crBkgnd)
{
if (m_hKnobBrush)
::DeleteObject(m_hKnobBrush);
m_hKnobBrush = ::CreateSolidBrush(crBkgnd);
return *this;
}
CRoundSliderCtrl& CRoundSliderCtrl::SetTextColor(COLORREF crText)
{
m_crText = crText;
RedrawWindow();
return *this;
}
CRoundSliderCtrl& CRoundSliderCtrl::SetFontBold(BOOL bBold)
{
m_lf.lfWeight = bBold ? FW_BOLD : FW_NORMAL;
ReconstructFont();
RedrawWindow();
return *this;
}
CRoundSliderCtrl& CRoundSliderCtrl::SetFontUnderline(BOOL bSet)
{
m_lf.lfUnderline = bSet;
ReconstructFont();
RedrawWindow();
return *this;
}
CRoundSliderCtrl& CRoundSliderCtrl::SetFontItalic(BOOL bSet)
{
m_lf.lfItalic = bSet;
ReconstructFont();
RedrawWindow();
return *this;
}
CRoundSliderCtrl& CRoundSliderCtrl::SetFontSize(int nSize)
{
nSize*=-1;
m_lf.lfHeight = nSize;
ReconstructFont();
RedrawWindow();
return *this;
}
CRoundSliderCtrl& CRoundSliderCtrl::SetFontName(const CString& strFont)
{
strcpy(m_lf.lfFaceName,strFont);
ReconstructFont();
RedrawWindow();
return *this;
}
#ifdef _DEBUG
void CRoundSliderCtrl::AssertValid() const
{
CSliderCtrl::AssertValid();
ASSERT(m_nZero >= 0 && m_nZero < 360);
ASSERT(m_nKnobRadius > 4);
}
void CRoundSliderCtrl::Dump(CDumpContext& dc) const
{
CSliderCtrl::Dump(dc);
dc << "m_strText = '" << m_strText << "'\n"
<< "m_nKnobRadius = " << m_nKnobRadius << "\n"
<< "m_nZero = " << m_nZero;
}
#endif // _DEBUG
BOOL CRoundSliderCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
HCURSOR m_hMagnify;
m_hMagnify = AfxGetApp()->LoadCursor(IDC_CURSOR1);
::SetCursor(m_hMagnify);
return TRUE;
//return CSliderCtrl::OnSetCursor(pWnd, nHitTest, message);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?