📄 macbuttons.cpp
字号:
else if (m_nCheckStyle == CHECK_STYLE_CROSS)
{
// Draw the check mark's shadow
pDC->SelectObject(bDisabled ? &m_penLiteShadow : &m_penShadow);
pDC->MoveTo(nLeft + 3, nTop + 7);
pDC->LineTo(nLeft + 9, nTop + 1);
pDC->SelectObject(&m_penLiteShadow);
pDC->MoveTo(nLeft + 3, nTop + 8);
pDC->LineTo(nLeft + 9, nTop + 2);
pDC->SetPixel(nLeft + 8, nTop + 7, bDisabled ? m_crLiteShadow : m_crShadow);
pDC->SetPixel(nLeft + 8, nTop + 8, m_crLiteShadow);
// Draw the check mark.
pDC->SelectObject(bDisabled ? &m_penShadow : &m_penDkShadow);
pDC->MoveTo(nLeft + 2, nTop + 1);
pDC->LineTo(nLeft + 8, nTop + 7);
pDC->MoveTo(nLeft + 2, nTop + 2);
pDC->LineTo(nLeft + 8, nTop + 8);
pDC->MoveTo(nLeft + 2, nTop + 6);
pDC->LineTo(nLeft + 8, nTop);
pDC->MoveTo(nLeft + 2, nTop + 7);
pDC->LineTo(nLeft + 8, nTop + 1);
}
} // if checked
else if (m_nCheck == 2)
{
pDC->SelectObject(&m_penLiteShadow);
pDC->MoveTo(nLeft + 3, nTop + 6);
pDC->LineTo(nLeft + 9, nTop + 6);
pDC->SetPixel(nLeft + 8, nTop + 5, m_crLiteShadow);
pDC->SelectObject(bDisabled ? &m_penShadow : &m_penDkShadow);
pDC->MoveTo(nLeft + 2, nTop + 4);
pDC->LineTo(nLeft + 8, nTop + 4);
pDC->MoveTo(nLeft + 2, nTop + 5);
pDC->LineTo(nLeft + 8, nTop + 5);
}
} // else draw 3D checkbox
// Restore the pen and brush.
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
} // DrawCheckBox
//-------------------------------------------------------------------
//
void CMacButton::DrawRadioButton(CDC *pDC, CRect rect, UINT nStyle, UINT nState)
//
// Return Value: None.
//
// Parameters : pDC - A pointer to the DC to draw on.
// rect - The radio's rectangle.
// nStyle - The button's style.
// nState - The button's state.
//
// Remarks : Draws the radio button.
//
{
// Give the user a visual indication that the button is pressed by darkening some colors.
BOOL bDarkened = FALSE;
if (m_bMouseDown && !(nStyle & BS_FLAT))
{
m_crFace = DarkenColor(m_crFace, 40);
m_crShadow = DarkenColor(m_crShadow, 40);
m_crHilight = DarkenColor(m_crHilight, 40);
m_crLiteShadow = DarkenColor(m_crLiteShadow, 40);
m_crLiteFace = DarkenColor(m_crLiteFace, 40);
CreatePens();
bDarkened = TRUE;
}
BOOL bDisabled = nState & ODS_DISABLED;
// Draw the outer round rect.
CPen penFrame;
CBrush br;
if (nStyle & BS_FLAT)
{
penFrame.CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOWFRAME));
br.CreateSolidBrush(::GetSysColor(COLOR_WINDOW));
}
else
{
penFrame.CreatePen(PS_SOLID, 1, bDisabled ? m_crShadow : ::GetSysColor(COLOR_WINDOWFRAME));
br.CreateSolidBrush(m_crFace);
}
CPen *pOldPen = (CPen *)pDC->SelectObject(&penFrame);
CBrush *pOldBrush = (CBrush *)pDC->SelectObject(&br);
pDC->RoundRect(rect, CPoint(10, 10));
if ((nStyle & BS_FLAT) && m_bMouseDown)
{
rect.DeflateRect(1, 1, 1, 1);
pDC->RoundRect(rect, CPoint(8, 8));
rect.InflateRect(1, 1, 1, 1);
}
pDC->SelectObject(pOldBrush);
br.DeleteObject();
penFrame.DeleteObject();
// Draw some shadowing
if (!(nStyle & BS_FLAT))
{
int nLeft = rect.left;
int nTop = rect.top;
int nAdjust = (m_nCheck || m_bMouseDown ? -11 : 0);
int nSign = (m_nCheck || m_bMouseDown ? -1 : 1);
if (!bDisabled)
{
pDC->SelectObject(&m_penDarkDkShadow);
pDC->MoveTo(nLeft + 0, nTop + 4);
pDC->LineTo(nLeft + 5, nTop - 1);
pDC->MoveTo(nLeft + 7, nTop);
pDC->LineTo(nLeft + 12, nTop + 5);
pDC->MoveTo(nLeft + 11, nTop + 7);
pDC->LineTo(nLeft + 6, nTop + 12);
pDC->MoveTo(nLeft + 4, nTop + 11);
pDC->LineTo(nLeft - 1, nTop + 6);
}
if (!bDisabled)
{
pDC->SelectObject(&m_penLiteFace);
pDC->MoveTo(nLeft + (nSign * (nAdjust + 1)), nTop + (nSign * (nAdjust + 6)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 1)), nTop + (nSign * (nAdjust + 4)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 4)), nTop + (nSign * (nAdjust + 1)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 7)), nTop + (nSign * (nAdjust + 1)));
pDC->MoveTo(nLeft + (nSign * (nAdjust + 2)), nTop + (nSign * (nAdjust + 8)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 9)), nTop + (nSign * (nAdjust + 1)));
pDC->MoveTo(nLeft + (nSign * (nAdjust + 3)), nTop + (nSign * (nAdjust + 8)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 9)), nTop + (nSign * (nAdjust + 2)));
pDC->MoveTo(nLeft + (nSign * (nAdjust + 4)), nTop + (nSign * (nAdjust + 8)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 9)), nTop + (nSign * (nAdjust + 3)));
pDC->SelectObject(&m_penHilight);
pDC->MoveTo(nLeft + (nSign * (nAdjust + 2)), nTop + (nSign * (nAdjust + 7)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 2)), nTop + (nSign * (nAdjust + 4)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 6)), nTop + (nSign * (nAdjust + 4)));
pDC->MoveTo(nLeft + (nSign * (nAdjust + 4)), nTop + (nSign * (nAdjust + 5)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 4)), nTop + (nSign * (nAdjust + 2)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 8)), nTop + (nSign * (nAdjust + 2)));
pDC->SelectObject(&m_penLiteShadow);
pDC->MoveTo(nLeft + (nSign * (nAdjust + 6)), nTop + (nSign * (nAdjust + 9)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 10)), nTop + (nSign * (nAdjust + 5)));
pDC->MoveTo(nLeft + (nSign * (nAdjust + 7)), nTop + (nSign * (nAdjust + 9)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 10)), nTop + (nSign * (nAdjust + 6)));
pDC->SelectObject(&m_penShadow);
pDC->MoveTo(nLeft + (nSign * (nAdjust + 4)), nTop + (nSign * (nAdjust + 10)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 7)), nTop + (nSign * (nAdjust + 10)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 10)), nTop + (nSign * (nAdjust + 7)));
pDC->LineTo(nLeft + (nSign * (nAdjust + 10)), nTop + (nSign * (nAdjust + 3)));
pDC->SetPixel(nLeft + (nSign * (nAdjust + 3)), nTop + (nSign * (nAdjust + 5)), m_crHilight);
pDC->SetPixel(nLeft + (nSign * (nAdjust + 5)), nTop + (nSign * (nAdjust + 3)), m_crHilight);
pDC->SetPixel(nLeft + (nSign * (nAdjust + 2)), nTop + (nSign * (nAdjust + 2)), m_crFace);
pDC->SetPixel(nLeft + (nSign * (nAdjust + 3)), nTop + (nSign * (nAdjust + 3)), m_crLiteFace);
pDC->SetPixel(nLeft + (nSign * (nAdjust + 3)), nTop + (nSign * (nAdjust + 6)), m_crLiteFace);
pDC->SetPixel(nLeft + (nSign * (nAdjust + 6)), nTop + (nSign * (nAdjust + 3)), m_crLiteFace);
}
// Do a little "touch-up" top make the radios look better.
COLORREF crTemp = bDisabled ? m_crLiteShadow : m_crShadow;
pDC->SetPixel(nLeft, nTop + 3, crTemp);
pDC->SetPixel(nLeft + 3, nTop, crTemp);
pDC->SetPixel(nLeft + 8, nTop, crTemp);
pDC->SetPixel(nLeft + 11, nTop + 3, crTemp);
pDC->SetPixel(nLeft + 11, nTop + 8, crTemp);
pDC->SetPixel(nLeft + 8, nTop + 11, crTemp);
pDC->SetPixel(nLeft + 3, nTop + 11, crTemp);
pDC->SetPixel(nLeft, nTop + 8, crTemp);
} // if not disabled and not flat
// Draw the check if necessary.
if (m_nCheck)
{
COLORREF crTemp = (bDisabled && !(nStyle & BS_FLAT) ? m_crShadow : m_crDkShadow);
CBrush br(crTemp);
CPen pen(PS_SOLID, 1, crTemp);
CBrush *pOldBrush = pDC->SelectObject(&br);
pDC->SelectObject(&pen);
rect.DeflateRect(3, 3, 3, 3);
pDC->RoundRect(rect, CPoint(2, 2));
pDC->SelectObject(pOldBrush);
}
// Lighten the colors if they were darkened.
if (bDarkened)
{
m_crFace = LightenColor(m_crFace, 40);
m_crShadow = LightenColor(m_crShadow, 40);
m_crHilight = LightenColor(m_crHilight, 40);
m_crLiteShadow = LightenColor(m_crLiteShadow, 40);
m_crLiteFace = LightenColor(m_crLiteFace, 40);
CreatePens();
}
pDC->SelectObject(pOldPen);
} // DrawRadioButton
//-------------------------------------------------------------------
//
void CMacButton::OnLButtonDblClk(UINT /*nFlags*/, CPoint point)
//
// Return Value: None.
//
// Parameters : nFlags - Indicates whether various virtual keys are down.
// point - Specifies the x- and y-coordinate of the cursor.
// These coordinates are always relative to the upper-left
// corner of the window.
//
// Remarks : The framework calls this member function when the user
// double-clicks the left mouse button. The WM_LBUTTONDOWN
// message is sent to simulate a single click.
//
{
SendMessage(WM_LBUTTONDOWN, 0, MAKELPARAM(point.x, point.y));
} // OnLButtonDblClk
//-------------------------------------------------------------------
//
void CMacButton::OnSysColorChange()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : The framework calls this member function for all
// top-level windows when a change is made in the
// system color setting
//
{
CButton::OnSysColorChange();
GetColors();
CreatePens();
} // OnSysColorChange
//-------------------------------------------------------------------
//
void CMacButton::GetColors()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Sets the COLORREF member variables.
//
{
if (m_nType == TYPE_MORE)
{
m_crDkShadow = ::GetSysColor(COLOR_WINDOWFRAME);
m_crShadow = ::GetSysColor(COLOR_3DSHADOW);
m_crLiteFace = LightenColor(m_crFace, 51);
m_crLiteShadow = DarkenColor(m_crFace, 51);
}
else
{
m_crHilight = ::GetSysColor(COLOR_3DHILIGHT);
m_crLiteFace = ::GetSysColor(COLOR_3DLIGHT);
m_crFace = ::GetSysColor(COLOR_3DFACE);
m_crShadow = ::GetSysColor(COLOR_3DSHADOW);
m_crDkShadow = ::GetSysColor(COLOR_3DDKSHADOW);
// Create some intermediate colors. This is done by averaging two colors.
BYTE byRedFace = GetRValue(m_crFace);
BYTE byGreenFace = GetGValue(m_crFace);
BYTE byBlueFace = GetBValue(m_crFace);
BYTE byRedShadow = GetRValue(m_crShadow);
BYTE byGreenShadow = GetGValue(m_crShadow);
BYTE byBlueShadow = GetBValue(m_crShadow);
BYTE byRedDkShadow = GetRValue(m_crDkShadow);
BYTE byGreenDkShadow = GetGValue(m_crDkShadow);
BYTE byBlueDkShadow = GetBValue(m_crDkShadow);
m_crLiteShadow = RGB(byRedFace + ((byRedShadow - byRedFace) >> 1),
byGreenFace + ((byGreenShadow - byGreenFace) >> 1),
byBlueFace + ((byBlueShadow - byBlueFace) >> 1));
m_crDarkDkShadow = RGB(byRedShadow + ((byRedDkShadow - byRedShadow) >> 1),
byGreenShadow + ((byGreenDkShadow - byGreenShadow) >> 1),
byBlueShadow + ((byBlueDkShadow - byBlueShadow) >> 1));
}
} // GetColors
//-------------------------------------------------------------------
//
COLORREF CMacButton::LightenColor(const COLORREF crColor, BYTE byIncreaseVal)
//
// Return Value: None.
//
// Parameters : crColor - References a COLORREF structure.
// byReduceVal - The amount to reduce the RGB values by.
//
// Remarks : Lightens a color by increasing the RGB values by the given number.
//
{
BYTE byRed = GetRValue(crColor);
BYTE byGreen = GetGValue(crColor);
BYTE byBlue = GetBValue(crColor);
byRed = (byRed + byIncreaseVal) <= 255 ? BYTE(byRed + byIncreaseVal) : 255;;
byGreen = (byGreen + byIncreaseVal) <= 255 ? BYTE(byGreen + byIncreaseVal) : 255;
byBlue = (byBlue + byIncreaseVal) <= 255 ? BYTE(byBlue + byIncreaseVal) : 255;
/* if ((byRed + byIncreaseVal) <= 255)
byRed = BYTE(byRed + byIncreaseVal);
if ((byGreen + byIncreaseVal) <= 255)
byGreen = BYTE(byGreen + byIncreaseVal);
if ((byBlue + byIncreaseVal) <= 255)
byBlue = BYTE(byBlue + byIncreaseVal);
*/
return RGB(byRed, byGreen, byBlue);
} // LightenColor
//-------------------------------------------------------------------
//
COLORREF CMacButton::DarkenColor(const COLORREF crColor, BYTE byReduceVal)
//
// Return Value: None.
//
// Parameters : crColor - References a COLORREF structure.
// byReduceVal - The amount to reduce the RGB values by.
//
// Remarks : Darkens a color by reducing the RGB values by the given number.
//
{
BYTE byRed = GetRValue(crColor);
BYTE byGreen = GetGValue(crColor);
BYTE byBlue = GetBValue(crColor);
byRed = byRed >= byReduceVal ? BYTE(byRed - byReduceVal) : 0;
byGreen = byGreen >= byReduceVal ? BYTE(byGreen - byReduceVal) : 0;
byBlue = (byBlue >= byReduceVal) ? BYTE(byBlue - byReduceVal) : 0;
/* if (byRed >= byReduceVal)
byRed = BYTE(byRed - byReduceVal);
if (byGreen >= byReduceVal)
byGreen = BYTE(byGreen - byReduceVal);
if (byBlue >= byReduceVal)
byBlue = BYTE(byBlue - byReduceVal);
*/
return RGB(byRed, byGreen, byBlue);
} // DarkenColor
//-------------------------------------------------------------------
//
void CMacButton::CreatePens()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Deletes the pen objects, if necessary, and creates them.
//
{
DeletePens();
m_penFace.CreatePen(PS_SOLID, 1, m_crFace);
m_penLiteFace.CreatePen(PS_SOLID, 1, m_crLiteFace);
m_penLiteShadow.CreatePen(PS_SOLID, 1, m_crLiteShadow);
m_penShadow.CreatePen(PS_SOLID, 1, m_crShadow);
m_penDkShadow.CreatePen(PS_SOLID, 1, m_crDkShadow);
if (m_nType != TYPE_MORE)
{
m_penHilight.CreatePen(PS_SOLID, 1, m_crHilight);
m_penDarkDkShadow.CreatePen(PS_SOLID, 1, m_crDarkDkShadow);
}
} // CreatePens
//-------------------------------------------------------------------
//
void CMacButton::DeletePens()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Deletes the pen objects.
//
{
if (m_penHilight.m_hObject)
m_penHilight.DeleteObject();
if (m_penFace.m_hObject)
m_penFace.DeleteObject();
if (m_penLiteFace.m_hObject)
m_penLiteFace.DeleteObject();
if (m_penLiteShadow.m_hObject)
m_penLiteShadow.DeleteObject();
if (m_penShadow.m_hObject)
m_penShadow.DeleteObject();
if (m_penDkShadow.m_hObject)
m_penDkShadow.DeleteObject();
if (m_penDarkDkShadow.m_hObject)
m_penDarkDkShadow.DeleteObject();
} // DeletePens
//-------------------------------------------------------------------
//
void CMacButton::DrawImage(CDC *pDC, CRect &rect, UINT nStyle, UINT nState)
//
// Return Value: None.
//
// Parameters : pDC - A pointer to the DC to draw on.
// sText - The text on the button.
// rect - The button rectangle.
// nStyle - The button's style.
// nState - The button's state.
//
// Remarks : Draws an icon or bitmap on the button.
//
{
// Calculate the left and right sides of the rect.
if ((m_nType == TYPE_STANDARD) || (nStyle & BS_PUSHLIKE))
{
if (nStyle & BS_LEFT)
rect.left += 5;
else if (nStyle & BS_RIGHT)
rect.left = rect.right - m_sizeImage.cx - 5;
else
rect.left = (rect.Width() - m_sizeImage.cx) >> 1;
} // if the button is standard or push-like
else
{
if (nStyle & BS_LEFT)
rect.left = (nStyle & BS_LEFTTEXT ? 2 : CHECKBOX_HEIGHT + 5);
else if (nStyle & BS_RIGHT)
rect.left = rect.right - m_sizeImage.cx - (nStyle & BS_LEFTTEXT ? CHECKBOX_HEIGHT + 7 : 2);
// Else use the default vertical alignment (left for radios & checkboxes, center for push buttons).
else
{
if (m_nType == TYPE_CHECKBOX || m_nType == TYPE_RADIO)
rect.left = (nStyle & BS_LEFTTEXT ? 2 : CHECKBOX_HEIGHT + 5);
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -