📄 macprogressctrl.cpp
字号:
// Parameters : pDC - Specifies the device context object.
// rect - Specifies the rectangle of the progess bar.
//
// Remarks : Draws a vertical progress bar.
//
{
int nHeight = rect.Height();
if (!nHeight)
return;
int nLeft = rect.left;
int nTop = rect.top;
int nRight = rect.right;
int nBottom = rect.bottom;
CPen *pOldPen = pDC->SelectObject(&m_penColor);
if (m_bIndeterminate)
{
int nNumBands = (nHeight / IND_BAND_WIDTH) + 2;
int nHeight = rect.Width() + 1;
int nAdjust = nBottom - m_nIndOffset;
int nXpos1 = nLeft;
int nXpos2 = nRight + 1;
int nYpos = nTop + 1;
for (int i = 0; i < nNumBands; i++)
{
nYpos = nAdjust - (i * IND_BAND_WIDTH);
pDC->SelectObject(&m_penColorDarker);
pDC->MoveTo(nXpos1, nYpos);
pDC->LineTo(nXpos2, nYpos + nHeight);
pDC->SelectObject(&m_penColorDark);
pDC->MoveTo(nXpos1, nYpos + 1);
pDC->LineTo(nXpos2, nYpos + nHeight + 1);
pDC->MoveTo(nXpos1, nYpos + 9);
pDC->LineTo(nXpos2, nYpos + nHeight + 9);
pDC->SelectObject(&m_penColor);
pDC->MoveTo(nXpos1, nYpos + 2);
pDC->LineTo(nXpos2, nYpos + nHeight + 2);
pDC->MoveTo(nXpos1, nYpos + 8);
pDC->LineTo(nXpos2, nYpos + nHeight + 8);
pDC->SelectObject(&m_penColorLight);
pDC->MoveTo(nXpos1, nYpos + 3);
pDC->LineTo(nXpos2, nYpos + nHeight + 3);
pDC->MoveTo(nXpos1, nYpos + 7);
pDC->LineTo(nXpos2, nYpos + nHeight + 7);
pDC->SelectObject(&m_penColorLighter);
pDC->MoveTo(nXpos1, nYpos + 4);
pDC->LineTo(nXpos2, nYpos + nHeight + 4);
pDC->MoveTo(nXpos1, nYpos + 6);
pDC->LineTo(nXpos2, nYpos + nHeight + 6);
} // for the number of bands
} // if indeterminate
else
{
if (nHeight > 3)
{
pDC->MoveTo(nLeft, nTop + 1);
pDC->LineTo(nLeft, nTop);
pDC->LineTo(nRight, nTop);
pDC->MoveTo(nLeft + 1, nBottom - 2);
pDC->LineTo(nLeft + 1, nTop + 1);
pDC->MoveTo(nRight - 3, nBottom - 3);
pDC->LineTo(nRight - 3, nTop + 1);
pDC->SetPixel(nRight - 2, nTop + 1, m_crColor);
pDC->SelectObject(&m_penColorLight);
pDC->MoveTo(nLeft + 2, nBottom - 3);
pDC->LineTo(nLeft + 2, nTop + 1);
pDC->MoveTo(nRight - 4, nBottom - 3);
pDC->LineTo(nRight - 4, nTop + 1);
pDC->SetPixel(nLeft + 1, nTop + 1, m_crColorLight);
pDC->SetPixel(nRight - 3, nTop + 1, m_crColorLight);
pDC->SelectObject(&m_penColorLighter);
pDC->MoveTo(nLeft + 3, nBottom - 3);
pDC->LineTo(nLeft + 3, nTop + 1);
pDC->MoveTo(nRight - 5, nBottom - 3);
pDC->LineTo(nRight - 5, nTop + 1);
pDC->SetPixel(nLeft + 2, nTop + 1, m_crColorLighter);
pDC->SetPixel(nRight - 4, nTop + 1, m_crColorLighter);
pDC->SelectObject(&m_penColorDark);
pDC->MoveTo(nLeft, nBottom - 1);
pDC->LineTo(nLeft, nTop + 1);
pDC->MoveTo(nLeft + 2, nBottom - 2);
pDC->LineTo(nRight - 2, nBottom - 2);
pDC->LineTo(nRight - 2, nTop + 1);
pDC->SetPixel(nRight - 1, nTop + 1, m_crColorDark);
pDC->SelectObject(&m_penColorDarker);
pDC->MoveTo(nLeft + 1, nBottom - 1);
pDC->LineTo(nRight - 1, nBottom - 1);
pDC->LineTo(nRight - 1, nTop + 1);
}
else
{
CBrush br(m_crColor);
CBrush *pOldBrush = pDC->SelectObject(&br);
pDC->SelectObject(&m_penColorDark);
pDC->Rectangle(rect);
pDC->SelectObject(pOldBrush);
}
} // if not indeterminate
pDC->SelectObject(pOldPen);
} // DrawVerticalBar
//-------------------------------------------------------------------
//
BOOL CMacProgressCtrl::OnEraseBkgnd(CDC* pDC)
//
// Return Value: Nonzero if it erases the background; otherwise 0.
//
// Parameters : pDC - Specifies the device-context object.
//
// Remarks : The framework calls this member function when the
// CWnd object background needs erasing (for example,
// when resized). It is called to prepare an invalidated
// region for painting.
//
{
return TRUE;
} // OnEraseBkgnd
//-------------------------------------------------------------------
//
void CMacProgressCtrl::GetColors()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Calculates the lighter and darker colors, as well as
// the shadow colors.
//
{
m_crColorLight = LightenColor(m_crColor, 51);
m_crColorLighter = LightenColor(m_crColorLight, 51);
m_crColorLightest = LightenColor(m_crColorLighter, 51);
m_crColorDark = DarkenColor(m_crColor, 51);
m_crColorDarker = DarkenColor(m_crColorDark, 51);
m_crDkShadow = ::GetSysColor(COLOR_3DDKSHADOW);
m_crLiteShadow = ::GetSysColor(COLOR_3DSHADOW);
// Get a color halfway between COLOR_3DDKSHADOW and COLOR_3DSHADOW
BYTE byRed3DDkShadow = GetRValue(m_crDkShadow);
BYTE byRed3DLiteShadow = GetRValue(m_crLiteShadow);
BYTE byGreen3DDkShadow = GetGValue(m_crDkShadow);
BYTE byGreen3DLiteShadow = GetGValue(m_crLiteShadow);
BYTE byBlue3DDkShadow = GetBValue(m_crDkShadow);
BYTE byBlue3DLiteShadow = GetBValue(m_crLiteShadow);
m_crShadow = RGB(byRed3DLiteShadow + ((byRed3DDkShadow - byRed3DLiteShadow) >> 1),
byGreen3DLiteShadow + ((byGreen3DDkShadow - byGreen3DLiteShadow) >> 1),
byBlue3DLiteShadow + ((byBlue3DDkShadow - byBlue3DLiteShadow) >> 1));
} // GetColors
//-------------------------------------------------------------------
//
void CMacProgressCtrl::SetColor(COLORREF crColor)
//
// Return Value: None.
//
// Parameters : crColor - New color.
//
// Remarks : Sets the progress bar control's color. The lighter
// darker colors are recalculated, and the pens recreated.
//
{
m_crColor = crColor;
GetColors();
CreatePens();
RedrawWindow();
} // SetColor
//-------------------------------------------------------------------
//
COLORREF CMacProgressCtrl::GetColor()
//
// Return Value: The current color.
//
// Parameters : None.
//
// Remarks : Returns the progress bar control's current color.
//
{
return m_crColor;
} // GetColor
//-------------------------------------------------------------------
//
void CMacProgressCtrl::CreatePens()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Deletes the pen objects, if necessary, and creates them.
//
{
DeletePens();
m_penColorLight.CreatePen(PS_SOLID, 1, m_crColorLight);
m_penColorLighter.CreatePen(PS_SOLID, 1, m_crColorLighter);
m_penColor.CreatePen(PS_SOLID, 1, m_crColor);
m_penColorDark.CreatePen(PS_SOLID, 1, m_crColorDark);
m_penColorDarker.CreatePen(PS_SOLID, 1, m_crColorDarker);
m_penDkShadow.CreatePen(PS_SOLID, 1, m_crDkShadow);
m_penShadow.CreatePen(PS_SOLID, 1, m_crShadow);
m_penLiteShadow.CreatePen(PS_SOLID, 1, m_crLiteShadow);
} // CreatePens
//-------------------------------------------------------------------
//
void CMacProgressCtrl::DeletePens()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Deletes the pen objects.
//
{
if (m_penColorLight.m_hObject)
m_penColorLight.DeleteObject();
if (m_penColorLighter.m_hObject)
m_penColorLighter.DeleteObject();
if (m_penColor.m_hObject)
m_penColor.DeleteObject();
if (m_penColorDark.m_hObject)
m_penColorDark.DeleteObject();
if (m_penColorDarker.m_hObject)
m_penColorDarker.DeleteObject();
if (m_penDkShadow.m_hObject)
m_penDkShadow.DeleteObject();
if (m_penShadow.m_hObject)
m_penShadow.DeleteObject();
if (m_penLiteShadow.m_hObject)
m_penLiteShadow.DeleteObject();
} // DeletePens
//-------------------------------------------------------------------
//
void CMacProgressCtrl::SetIndeterminate(BOOL bIndeterminate)
//
// Return Value: None.
//
// Parameters : bIndeterminate - Specifies the indeterminate state.
//
// Remarks : Sets the indeterminate flag.
//
{
m_bIndeterminate = bIndeterminate;
if (m_bIndeterminate)
{
CRect rect;
GetClientRect(rect);
m_nIndOffset = 0;
RedrawWindow();
SetTimer(IDT_INDETERMINATE, 25, NULL);
}
else
{
KillTimer(IDT_INDETERMINATE);
RedrawWindow();
}
} // SetIndeterminate
//-------------------------------------------------------------------
//
BOOL CMacProgressCtrl::GetIndeterminate()
//
// Return Value: m_bIndeterminate.
//
// Parameters : None.
//
// Remarks : Returns m_bIndeterminate.
//
{
return m_bIndeterminate;
} // GetIndeterminate
//-------------------------------------------------------------------
//
void CMacProgressCtrl::OnTimer(UINT nIDEvent)
//
// Return Value: None.
//
// Parameters : nIDEvent - Specifies the identifier of the timer.
//
// Remarks : The framework calls this member function after each
// interval specified in the SetTimer member function used
// to install a timer.
//
{
// Increment the indeterminate bar offset and redraw the window.
if (nIDEvent == IDT_INDETERMINATE)
{
KillTimer(nIDEvent);
if (++m_nIndOffset > IND_BAND_WIDTH - 1)
m_nIndOffset = 0;
RedrawWindow();
SetTimer(IDT_INDETERMINATE, 25, NULL);
}
} // OnTimer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -