#include "StdAfx.h"
#include "CustomSlider.h"
#include "memdc.h" //双缓冲
CCustomSlider::CCustomSlider(void)
{
m_nPos = 0;
m_nMin = 0;
m_nMax = 100;
m_nPage = 20;
m_bkgColor = GetSysColor(COLOR_BTNFACE);
m_bChannelWithBm = m_bChannelActiveWithBm = FALSE;
m_bThumbWithBm = m_bThumbActiveWithBm = FALSE;
m_nChannelWidth = m_nChannelHeight = 0;
m_nThumbWidth = m_nThumbHeight = 0;
m_bLButtonDown = FALSE;
m_hCursor = NULL;
m_nMargin = 0;
m_bEnable = TRUE;
}
CCustomSlider::~CCustomSlider(void)
{
}
BEGIN_MESSAGE_MAP(CCustomSlider, CWnd)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_SETCURSOR()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
BOOL CCustomSlider::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
void CCustomSlider::OnPaint()
{
CPaintDC dc(this);
//dc.SetBkMode(TRANSPARENT); //控件背景透明
CRect rcClient;
GetClientRect(&rcClient);
CMemDC dcMem(&dc, &rcClient); //双缓冲实现类
dcMem.FillSolidRect(rcClient, m_bkgColor); //画背景色
CDC dcTmp;
dcTmp.CreateCompatibleDC(&dcMem);
dcMem.SetStretchBltMode(COLORONCOLOR);
CBitmap *pBmpOld = NULL;
if (m_bChannelWithBm) { //画带图片的背景通道
pBmpOld = dcTmp.SelectObject(&m_bmChannel);
int xStart = rcClient.left + m_nMargin;
int yStart = rcClient.top + (rcClient.Height() - m_nChannelHeight) / 2;
int nWidth = rcClient.Width() - (m_nMargin * 2);
dcMem.StretchBlt(xStart, yStart, nWidth, m_nChannelHeight,
&dcTmp, 0, 0, m_nChannelWidth, m_nChannelHeight, SRCCOPY); //横向拉伸
dcTmp.SelectObject(pBmpOld);
if (m_bChannelActiveWithBm) { //画带图片的激活通道
dcTmp.SelectObject(&m_bmChannelActive);
xStart = rcClient.left + m_nMargin;
yStart = rcClient.top + (rcClient.Height() - m_nChannelHeight) / 2;
nWidth = (int)((rcClient.Width()-(m_nMargin * 2)) * ((double)(m_nPos - m_nMin) / (m_nMax - m_nMin)));
dcMem.StretchBlt(xStart, yStart, nWidth, m_nChannelHeight,
&dcTmp, 0, 0, m_nChannelWidth, m_nChannelHeight, SRCCOPY);
}
dcTmp.SelectObject(pBmpOld);
}
else { //如果没有图片,画个简单的通道
dcMem.Draw3dRect(rcClient, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DSHADOW)); //边框
CRect rcChannel = rcClient;
rcChannel.left++; rcChannel.right--; rcChannel.top++; rcChannel.bottom--;
dcMem.FillSolidRect(rcChannel, GetSysColor(COLOR_BTNFACE)); //背景部分
rcChannel.right = (LONG)(rcChannel.left + (rcChannel.Width() * ((double)(m_nPos - m_nMin) / (m_nMax - m_nMin))));
dcMem.FillSolidRect(rcChannel, GetSysColor(COLOR_ACTIVECAPTION)); //激活部分
}
// 画thumb按钮
if(m_bThumbWithBm) {
if(m_bThumbActiveWithBm && m_bLButtonDown )
pBmpOld = dcTmp.SelectObject(&m_bmThumbActive);
else
pBmpOld = dcTmp.SelectObject(&m_bmThumb);
int xStart = (int)(rcClient.left
+ (rcClient.Width()-m_nThumbWidth) * ((double)(m_nPos - m_nMin) / (m_nMax - m_nMin))); //定位按钮位置
int yStart = rcClient.top + (rcClient.Height() - m_nThumbHeight) / 2;
dcMem.BitBlt(xStart, yStart, m_nThumbWidth, m_nThumbHeight, &dcTmp, 0, 0, SRCCOPY);
dcTmp.SelectObject(pBmpOld);
}
dcTmp.DeleteDC();
}
void CCustomSlider::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(!m_bEnable)
return;
m_bLButtonDown = TRUE;
SetCapture();
SetFocus();
OnMouseMove(nFlags, point);
Invalidate();
CWnd::OnLButtonDown(nFlags, point);
}
void CCustomSlider::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(!m_bEnable)
return;
ReleaseCapture();
m_bLButtonDown = FALSE;
Invalidate();
CWnd::OnLButtonUp(nFlags, point);
}
void CCustomSlider::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(!m_bLButtonDown || !m_bEnable)
return;
CRect rcClient;
GetClientRect(&rcClient);
int nPosNow = (int)(m_nMin +
((double)(point.x-m_nMargin) / (rcClient.Width()-m_nMargin*2)) * (m_nMax - m_nMin) + 0.5); //round
if (nPosNow != m_nPos)
SetPos(nPosNow);
CWnd::OnMouseMove(nFlags, point);
}
void CCustomSlider::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if(!m_bEnable)
return;
switch(nChar) {
// Left & up
case VK_LEFT :
case VK_UP :
SetPos(m_nPos-1);
break;
// Right & down
case VK_RIGHT :
case VK_DOWN :
SetPos(m_nPos+1);
break;
// Home
case VK_HOME :
SetPos(m_nMin);
break;
// End
case VK_END :
SetPos(m_nMax);
break;
// Page up
case VK_PRIOR :
SetPos(m_nPos - m_nPage);
break;
// Page down
case VK_NEXT :
SetPos(m_nPos + m_nPage);
break;
default :
break;
}
CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
BOOL CCustomSlider::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
if(m_hCursor != NULL)
{
::SetCursor(m_hCursor);
return TRUE;
}
return FALSE;
}
void CCustomSlider::SetBkgColor(COLORREF clr)
{
m_bkgColor = clr;
}
BOOL CCustomSlider::SetBitmapChannel(UINT nChannelID, UINT nActiveID)
{
if (!nChannelID) {
m_bChannelWithBm = FALSE;
m_bmChannel.DeleteObject();
m_bmChannelActive.DeleteObject();
return TRUE;
}
m_bmChannel.DeleteObject();
if(!m_bmChannel.LoadBitmap(nChannelID))
return FALSE;
m_bChannelWithBm = TRUE;
if(nActiveID) {
m_bmChannelActive.DeleteObject();
if(!m_bmChannelActive.LoadBitmap(nActiveID)) {
m_bmChannel.DeleteObject();
return FALSE;
}
m_bChannelActiveWithBm = TRUE;
}
else
m_bChannelActiveWithBm = FALSE;
// Get size of bitmap.
BITMAP bitmap;
m_bmChannel.GetBitmap(&bitmap);
m_nChannelWidth = bitmap.bmWidth;
m_nChannelHeight = bitmap.bmHeight;
return TRUE;
}
BOOL CCustomSlider::SetBitmapThumb(UINT nThumbID, UINT nActiveID)
{
if(!nThumbID) {
m_bThumbWithBm = FALSE;
m_bmThumb.DeleteObject();
m_bmThumbActive.DeleteObject();
return TRUE;
}
m_bmThumb.DeleteObject();
if(!m_bmThumb.LoadBitmap(nThumbID))
return FALSE;
m_bThumbWithBm = TRUE;
if(nActiveID) {
m_bmThumbActive.DeleteObject();
if( !m_bmThumbActive.LoadBitmap( nActiveID ) ) {
m_bmThumb.DeleteObject();
return FALSE;
}
m_bThumbActiveWithBm = TRUE;
}
else
m_bThumbActiveWithBm = FALSE;
//Get size of the bitmap
BITMAP bitmap;
m_bmThumb.GetBitmap( &bitmap );
m_nThumbWidth = bitmap.bmWidth;
m_nThumbHeight = bitmap.bmHeight;
CRect rcClient;
GetClientRect(&rcClient);
ASSERT(m_nThumbHeight <= rcClient.Height() && m_nThumbWidth <= rcClient.Width());
return TRUE;
}
void CCustomSlider::SetPos(int nPos)
{
m_nPos = nPos;
// Boundary check
if(m_nPos > m_nMax)
m_nPos = m_nMax;
if(m_nPos < m_nMin)
m_nPos = m_nMin;
Invalidate();
}
void CCustomSlider::SetRange(int nMin, int nMax, BOOL bRedraw)
{
SetRangeMin(nMin, FALSE);
SetRangeMax(nMax, bRedraw);
}
void CCustomSlider::SetRangeMin(int nMin, BOOL bRedraw)
{
m_nMin = nMin;
if(bRedraw)
Invalidate();
}
void CCustomSlider::SetRangeMax(int nMax, BOOL bRedraw)
{
m_nMax = nMax;
if(bRedraw)
Invalidate();
}
void CCustomSlider::Enable(BOOL bEnable)
{
m_bEnable = bEnable;
// If control is disabled during dragging
if(!m_bEnable && m_bLButtonDown) {
m_bLButtonDown = FALSE;
ReleaseCapture();
}
Invalidate();
}
自绘滑块控件(Slider Control)
4星 · 超过85%的资源 需积分: 50 46 浏览量
2014-04-30
14:36:25
上传
评论 3
收藏 5KB ZIP 举报
大狗的偏执
- 粉丝: 0
- 资源: 3
最新资源
- 基于去中心化联邦学习的货运速度预测时空模型-A decentralized federated learning-based s
- 适合新手的 OpenAI Sora 详细使用教程
- 驱动总裁离线安装包01
- NT98336 SDK 114版本
- torch-1.8.1+cu111-cp38-cp38-linux-x86-64.whl +torchvision
- 智能提取字幕-intel
- 计算机设计 - VB+ACCESS网络计时管理系统设计(源代码+系统),保证可靠运行,毕业生可参考,免费资源下载
- 信号处理,通信原理,数字通信信号处理与系统分析
- 计算机设计 - vb+ACCESS身份证管理系统设计(LW+源代码),保证可靠运行,毕业生可参考,免费资源下载
- 智能提取字幕-win10
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页