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

📄 tsslider.cpp

📁 深入剖析Visual C++编程技术及应用实例
💻 CPP
字号:
// TsSlider.cpp : implementation file
//

#include "stdafx.h"
#include "SExam2.h"
#include "TsSlider.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTsSlider

CTsSlider::CTsSlider()
{
	m_fmtSlider.bHorz=TRUE;
	m_pBackGround=NULL;
	m_pBlock=NULL;
}

CTsSlider::~CTsSlider()
{
	if(m_pBackGround)
		delete[] m_pBackGround;
	if(m_pBlock)
		delete[] m_pBlock;
}


BEGIN_MESSAGE_MAP(CTsSlider, CWnd)
	//{{AFX_MSG_MAP(CTsSlider)
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_RBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CTsSlider message handlers

void CTsSlider::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	DrawGround(&dc);
	CRect rect;	
	GetClientRect(&rect);
	int mid;
	if(m_fmtSlider.bHorz)
	{
		mid=(rect.top+rect.bottom)/2;
	}
	else
	{
		mid=(rect.left+rect.right)/2;
	}
	int nSM=m_nCurPos;
	if(m_pBlock==NULL)	//如果没有滑块图,则用颜色填充
	{
		CRect rcSlider;
		if(m_fmtSlider.bHorz)
			rcSlider=CRect(nSM-3,mid-10,nSM+3,mid+10);
		else
			rcSlider=CRect(mid-10,nSM-3,mid+10,nSM+3);
		CBrush bshSlider;
		bshSlider.CreateSolidBrush(m_fmtSlider.clrBlock);
		dc.FillRect(&rcSlider,&bshSlider);
	}
	else	//绘制滑块图像
	{
		PBITMAPFILEHEADER pbh=(PBITMAPFILEHEADER)m_pBlock;
		PBITMAPINFO pbi=(PBITMAPINFO)(m_pBlock+sizeof(BITMAPFILEHEADER));
		PBYTE pBuff=m_pBlock+pbh->bfOffBits;
		int xOff,yOff;
		//居中显示
		if(m_fmtSlider.bHorz)
		{
			xOff=nSM-pbi->bmiHeader.biWidth/2;
			yOff=mid-pbi->bmiHeader.biHeight/2;
		}
		else
		{
			xOff=mid-pbi->bmiHeader.biWidth/2;
			yOff=nSM-pbi->bmiHeader.biHeight/2;
		}
		SetDIBitsToDevice(dc.GetSafeHdc(),	xOff,	yOff,
					pbi->bmiHeader.biWidth,
					pbi->bmiHeader.biHeight,
					0,	0,	0,
					pbi->bmiHeader.biHeight,	pBuff,
					pbi,	DIB_RGB_COLORS	);

	}
	// Do not call CWnd::OnPaint() for painting messages
}

void CTsSlider::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	SetCapture();
	CWnd::OnLButtonDown(nFlags, point);
}

void CTsSlider::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	int nPos;
	if(m_fmtSlider.bHorz)
		nPos=point.x;
	else
		nPos=point.y;
	SetCurPos(nPos);
//	::PostMessage(GetParent()->GetSafeHwnd(),TS_MSG_SLIDER_VALUE_CHANGED,(WPARAM)m_hWnd,m_nCurVal);
	ReleaseCapture();
	CWnd::OnLButtonUp(nFlags, point);
}

void CTsSlider::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if ( nFlags & MK_LBUTTON )
	{
		int nPos;
		if(m_fmtSlider.bHorz)
			nPos=point.x;
		else
			nPos=point.y;
		SetCurPos(nPos);
	}
	CWnd::OnMouseMove(nFlags, point);
}

void CTsSlider::SetPosRange(int nMin, int nMax)
{
	if(nMax<nMin)
		return;
	m_fmtSlider.nMaxPos=nMax;
	m_fmtSlider.nMinPos=nMin;
	m_nCurPos=m_fmtSlider.bHorz?nMin:nMax;
}

void CTsSlider::SetStyle(BOOL bHorz)
{
	m_fmtSlider.bHorz=bHorz;
}

void CTsSlider::SetValueRange(long nMin, long nMax)
{
	if(nMax<nMin)
		return;
	m_nMaxVal=nMax;
	m_nMinVal=nMin;
	m_nCurVal=nMin;
}

void CTsSlider::SetCurPos(int nPos)
{
	if(nPos==m_nCurPos)
		return;
	if(nPos<=m_fmtSlider.nMaxPos&&nPos>=m_fmtSlider.nMinPos)
	{
		m_nCurPos=nPos;
		if(m_fmtSlider.bHorz)
			m_nCurVal=m_nMinVal+((m_fmtSlider.nMinPos==m_fmtSlider.nMaxPos)?0:(m_nMaxVal-m_nMinVal)*(nPos-m_fmtSlider.nMinPos)/(m_fmtSlider.nMaxPos-m_fmtSlider.nMinPos));
		else
			m_nCurVal=m_nMinVal+((m_fmtSlider.nMinPos==m_fmtSlider.nMaxPos)?0:(m_nMaxVal-m_nMinVal)*(m_fmtSlider.nMaxPos-nPos)/(m_fmtSlider.nMaxPos-m_fmtSlider.nMinPos));
		RedrawWindow();
//		::PostMessage(GetParent()->GetSafeHwnd(),TS_MSG_SLIDER_CHANGE_VALUE,(WPARAM)m_hWnd,m_nCurVal);
	}
}


void CTsSlider::SetValue(long nValue)
{
	if(nValue<=m_nMaxVal&&nValue>=m_nMinVal)
	{	
		m_nCurVal=nValue;
		int nTmp;
		if(m_fmtSlider.bHorz)
			nTmp=m_fmtSlider.nMinPos+((m_nMinVal==m_nMaxVal)?0:(m_fmtSlider.nMaxPos-m_fmtSlider.nMinPos)*(nValue-m_nMinVal)/(m_nMaxVal-m_nMinVal));
		else
			nTmp=m_fmtSlider.nMinPos+((m_nMinVal==m_nMaxVal)?0:(m_fmtSlider.nMaxPos-m_fmtSlider.nMinPos)*(m_nMaxVal-nValue)/(m_nMaxVal-m_nMinVal));
		if(nTmp!=m_nCurPos)
		{
			m_nCurPos=nTmp;
			RedrawWindow();
//			::PostMessage(GetParent()->GetSafeHwnd(),TS_MSG_SLIDER_CHANGE_VALUE,(WPARAM)m_hWnd,m_nCurVal);
		}
	}
}

void CTsSlider::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CRect rect;
	GetWindowRect(&rect);
	
	CMenu menu;
	menu.CreatePopupMenu();	//创建菜单
	//添加选项
	CString str;
	str.Format("当前数值%ld",m_nCurVal);
	menu.AppendMenu(MF_STRING, 0, str);
	int nPos;
	long lVal;
	if(m_fmtSlider.bHorz)
		nPos=point.x;
	else
		nPos=point.y;
	if(m_fmtSlider.bHorz)
		lVal=m_nMinVal+((m_fmtSlider.nMinPos==m_fmtSlider.nMaxPos)?0:(m_nMaxVal-m_nMinVal)*(nPos-m_fmtSlider.nMinPos)/(m_fmtSlider.nMaxPos-m_fmtSlider.nMinPos));
	else
		lVal=m_nMinVal+((m_fmtSlider.nMinPos==m_fmtSlider.nMaxPos)?0:(m_nMaxVal-m_nMinVal)*(m_fmtSlider.nMaxPos-nPos)/(m_fmtSlider.nMaxPos-m_fmtSlider.nMinPos));

	str.Format("鼠标数值%ld",lVal);
	menu.AppendMenu(MF_STRING, 0, str);
	//弹出菜单
	menu.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,
						point.x+rect.left, point.y+rect.top, this);
	
	CWnd::OnRButtonDown(nFlags, point);
}

long CTsSlider::GetValue()
{
	return m_nCurVal;
}

void CTsSlider::SetStyle(SliderFormat &fmt)
{
	m_fmtSlider.bHorz			=	fmt.bHorz;
	m_fmtSlider.bBack			=	fmt.bBack;
	m_fmtSlider.clrBack			=	fmt.clrBack;
	m_fmtSlider.clrBlock		=	fmt.clrBlock;
	m_fmtSlider.clrStaff		=	fmt.clrStaff;
	m_fmtSlider.szBackImage		=	fmt.szBackImage;
	m_fmtSlider.szBlockImage	=	fmt.szBlockImage;
	SetPosRange(fmt.nMinPos,fmt.nMaxPos);
	if(m_pBackGround)
	{
		delete[] m_pBackGround;
		m_pBackGround=NULL;
	}
	if(m_pBlock)
	{
		delete[] m_pBlock;
		m_pBlock=NULL;
	}
	CFile file;
	if(file.Open(fmt.szBackImage,CFile::modeRead))
	{
		m_pBackGround=new BYTE[file.GetLength()];
		if(m_pBackGround)
		{
			file.Read(m_pBackGround,file.GetLength());
		}
		file.Close();
	}
	if(file.Open(fmt.szBlockImage,CFile::modeRead))
	{
		m_pBlock=new BYTE[file.GetLength()];
		if(m_pBlock)
		{
			file.Read(m_pBlock,file.GetLength());
		}
		file.Close();
	}
}

void CTsSlider::DrawGround(CDC *pDC)
{
	CRect rect;	
	GetClientRect(&rect);
	if(m_fmtSlider.bBack)
	{
		if(m_pBackGround)	// 有背景图
		{
			PBITMAPFILEHEADER pbh=(PBITMAPFILEHEADER)m_pBackGround;
			PBITMAPINFO pbi=(PBITMAPINFO)(m_pBackGround+sizeof(BITMAPFILEHEADER));
			PBYTE pBuff=m_pBackGround+pbh->bfOffBits;
			int xOff,yOff;
			//居中显示
			xOff=(rect.Width()-pbi->bmiHeader.biWidth)/2;
			yOff=(rect.Height()-pbi->bmiHeader.biHeight)/2;
			SetDIBitsToDevice(pDC->GetSafeHdc(),	xOff,	yOff,
					pbi->bmiHeader.biWidth,
					pbi->bmiHeader.biHeight,
					0,	0,	0,
					pbi->bmiHeader.biHeight,	pBuff,
					pbi,	DIB_RGB_COLORS	);
		}
		else		//无图,用背景色填充
		{
			CBrush bshGround;
			bshGround.CreateSolidBrush(m_fmtSlider.clrBack);	
			pDC->FillRect(&rect,&bshGround);
			CPen pen,*oldPen;
			pen.CreatePen(0,1,m_fmtSlider.clrStaff);
			oldPen=pDC->SelectObject(&pen);
			int mid;
			if(m_fmtSlider.bHorz)
			{
				mid=(rect.top+rect.bottom)/2;
				pDC->MoveTo(m_fmtSlider.nMinPos,mid-1);
				pDC->LineTo(m_fmtSlider.nMaxPos,mid-1);
				pDC->LineTo(m_fmtSlider.nMaxPos,mid+1);
				pDC->LineTo(m_fmtSlider.nMinPos,mid+1);
				pDC->LineTo(m_fmtSlider.nMinPos,mid-1);
			}
			else
			{
				mid=(rect.left+rect.right)/2;
				pDC->MoveTo(mid-1,m_fmtSlider.nMinPos);
				pDC->LineTo(mid-1,m_fmtSlider.nMaxPos);
				pDC->LineTo(mid+1,m_fmtSlider.nMaxPos);
				pDC->LineTo(mid+1,m_fmtSlider.nMinPos);
				pDC->LineTo(mid-1,m_fmtSlider.nMinPos);
			}
			pDC->SelectObject(oldPen);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -