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

📄 macsliderctrl.cpp

📁 无线图象监控系统(用VC++编程)用数据库ACCESS存储图象
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	// 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 + -