⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macbuttons.cpp

📁 这是我仿照串口助手(龚建伟)作的一个例子并修正了其中的一些bug
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			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 + -