📄 tsslider.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 + -