很有创意的滑块按钮

来源:互联网 发布:dota臂章数据 编辑:程序博客网 时间:2024/05/17 02:29

这个按钮滑块不是我写的,虽然不是非常非常的好用,不过觉得比较有创意。所以整理了下留作纪念。

/*******************************************************************************
    文件名称 : CSliderButton.h 头文件
    作    者 : 杨治忠
    创建时间 : 2010-11-4  16:52:07
    文件描述 : 按钮滑块
    版权声明 : Copyright (C) 2010-2012 扬名科技
    修改历史 : 杨治忠 2010-11-4    1.00    初始版本
*******************************************************************************/
#pragma once


// CSliderButton

class CSliderButton : public CButton
{
 DECLARE_DYNAMIC(CSliderButton)

public:
 CSliderButton();
 virtual ~CSliderButton();

protected:
 DECLARE_MESSAGE_MAP()
public:
 virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
 virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
 virtual void PreSubclassWindow();
public:
 void GetRange(UINT &nMax,UINT &nMin);
 UINT GetSlidePos();
 void Init(UINT nBkgndID,UINT nSlideID,CString strTipText);
 void Init(UINT nBkgndID,UINT nSlideID,UINT nMax,UINT nMin,CString strTipText);
 void SetToolTipText(CString strText);
 void SetButtonCursor(HCURSOR hCursor);
 void SetSlidePos(UINT nPos);
 void SetRange(UINT nMin,UINT nMax);
 void SetBitmap(UINT nBkgnd,UINT nSlide);
protected:
 afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
private:
 UINT m_nWidth;
 void AdjustPosition();
 void DrawSlide(CDC*pDC);
 void DrawBackground(CDC*pDC);
 UINT m_nCurrentPos;
 UINT m_nMax;
 UINT m_nMin;
 void SetDefaultCursor();
 HCURSOR m_hCursor;
 CToolTipCtrl m_ToolTip;
 CWnd* pWndParent;
 UINT m_nSlide;
 UINT m_nBkgnd;
};

// SliderButton.cpp : 实现文件
/*******************************************************************************
    文件名称 : SliderButton.cpp 实现文件
    作    者 : 杨治忠
    创建时间 : 2010-11-4  17:49:21
    文件描述 : 按钮滑块
    版权声明 : Copyright (C) 2010-2012 扬名科技
    修改历史 : 杨治忠 2010-11-4    1.00    初始版本
*******************************************************************************/

#include "stdafx.h"
#include "SliderButton.h"

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

IMPLEMENT_DYNAMIC(CSliderButton, CButton)

CSliderButton::CSliderButton()
{

}

CSliderButton::~CSliderButton()
{
}


BEGIN_MESSAGE_MAP(CSliderButton, CButton)
 ON_WM_SETCURSOR()
 ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

 

// CSliderButton 消息处理程序
/********************************************************************
函数名称  : SetBitmap(UINT nBkgnd, UINT nSlide)
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::SetBitmap(UINT nBkgnd, UINT nSlide)
{
 m_nBkgnd=nBkgnd;
 nSlide=m_nSlide;
 Invalidate();
}
/********************************************************************
函数名称  : SetDefaultCursor()
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::SetDefaultCursor()
{
 m_hCursor=LoadCursor(NULL,MAKEINTRESOURCE(32649));
}
/********************************************************************
函数名称  : SetRange(UINT nMin, UINT nMax)
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::SetRange(UINT nMin, UINT nMax)
{
 m_nMin=nMin;
 m_nMax=nMax;
 AdjustPosition();
 Invalidate();
}
/********************************************************************
函数名称  : SetSlidePos(UINT nPos)
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::SetSlidePos(UINT nPos)
{
 m_nCurrentPos=nPos;
 Invalidate();
}
/********************************************************************
函数名称  : DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 // TODO: Add your code to draw the specified item
 CDC*pDC;
 pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
 DrawBackground(pDC);
 DrawSlide(pDC);
}
/********************************************************************
函数名称  : PreSubclassWindow()
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::PreSubclassWindow()
{
 // TODO: Add your specialized code here and/or call the base class
 SetDefaultCursor();

 CRect rect;
 GetClientRect(&rect);
 m_ToolTip.Create(this);
 m_ToolTip.SetDelayTime(100);
 m_ToolTip.SetMaxTipWidth(200);
 m_ToolTip.AddTool(this,"",rect,ID_TIP);

 CButton::PreSubclassWindow();
}
/********************************************************************
函数名称  : PreTranslateMessage(MSG* pMsg)
备注      : QQ 940446982
*********************************************************************/
BOOL CSliderButton::PreTranslateMessage(MSG* pMsg)
{
 // TODO: Add your specialized code here and/or call the base class
 m_ToolTip.RelayEvent(pMsg);
 return CButton::PreTranslateMessage(pMsg);
}
/********************************************************************
函数名称  : OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
备注      : QQ 940446982
*********************************************************************/
BOOL CSliderButton::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;
}
/********************************************************************
函数名称  : SetButtonCursor(HCURSOR hCursor)
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::SetButtonCursor(HCURSOR hCursor)
{
 m_hCursor=hCursor;
}
/********************************************************************
函数名称  : DrawBackground(CDC*pDC)
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::DrawBackground(CDC*pDC)
{
 CDC MemDC;   
 CBitmap bitmap;
 BITMAP m_bitmap;

 bitmap.LoadBitmap(m_nBkgnd);
 bitmap.GetBitmap(&m_bitmap);

 MemDC.CreateCompatibleDC(pDC);
 MemDC.SelectObject(&bitmap);

 pDC->BitBlt(0,0,m_bitmap.bmWidth,m_bitmap.bmHeight,&MemDC,
  0,0,SRCCOPY);

 bitmap.DeleteObject();
 MemDC.DeleteDC();
}
/********************************************************************
函数名称  : DrawSlide(CDC *pDC)
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::DrawSlide(CDC *pDC)
{
 CRect rect;
 GetClientRect(&rect);
 int nWidth=rect.Width();

 CBitmap bitmap;
 BITMAP m_bitmap;
 CDC MemDC;

 bitmap.LoadBitmap(m_nSlide);
 bitmap.GetBitmap(&m_bitmap);

 nWidth-=m_bitmap.bmWidth;
 int x=(int)(((float)nWidth/(float)(m_nMax-m_nMin))*(m_nCurrentPos-m_nMin));
 if(x<0)
  x=0;

 MemDC.CreateCompatibleDC(pDC);
 MemDC.SelectObject(&bitmap);

 pDC->BitBlt(x,0,m_bitmap.bmWidth,m_bitmap.bmHeight,
  &MemDC,0,0,SRCCOPY);

 bitmap.DeleteObject();
 MemDC.DeleteDC();

 m_nWidth=nWidth;
}
/********************************************************************
函数名称  : SetToolTipText(CString strText)
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::SetToolTipText(CString strText)
{
 m_ToolTip.UpdateTipText(strText,this,ID_TIP);
}
/********************************************************************
函数名称  : Init(UINT nBkgndID, UINT nSlideID, UINT nMax, UINT nMin, CString strTipText)
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::Init(UINT nBkgndID, UINT nSlideID, UINT nMax, UINT nMin, CString strTipText)
{
 m_nBkgnd=nBkgndID;
 m_nSlide=nSlideID;
 m_nMax=nMax;
 m_nMin=nMin;
 m_ToolTip.UpdateTipText(strTipText,this,ID_TIP);
 m_nCurrentPos=m_nMin;
 pWndParent=GetParent();
 AdjustPosition();
}
/********************************************************************
函数名称  : Init(UINT nBkgndID, UINT nSlideID, CString strTipText)
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::Init(UINT nBkgndID, UINT nSlideID, CString strTipText)
{
 m_nBkgnd=nBkgndID;
 m_nSlide=nSlideID;
 m_nMax=100;
 m_nMin=1;
 m_ToolTip.UpdateTipText(strTipText,this,ID_TIP);
 m_nCurrentPos=m_nMin;
 pWndParent=GetParent();
 AdjustPosition();
}
/********************************************************************
函数名称  : GetSlidePos()
备注      : QQ 940446982
*********************************************************************/
UINT CSliderButton::GetSlidePos()
{
 return m_nCurrentPos;
}
/********************************************************************
函数名称  : AdjustPosition()
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::AdjustPosition()
{
 CRect rect;
 CBitmap bitmap;
 BITMAP m_bitmap;

 bitmap.LoadBitmap(m_nBkgnd);
 bitmap.GetBitmap(&m_bitmap);

 GetWindowRect(&rect);
 pWndParent->ScreenToClient(&rect);
 rect.right=rect.left+m_bitmap.bmWidth;
 rect.bottom=rect.top+m_bitmap.bmHeight;
 MoveWindow(&rect,TRUE);

 bitmap.DeleteObject();

}
/********************************************************************
函数名称  : OnLButtonDown(UINT nFlags, CPoint point)
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 CRect rect;
 GetClientRect(&rect);
 if(rect.PtInRect(point)){
  m_nCurrentPos=(UINT)((float)point.x/(float)m_nWidth*(m_nMax-m_nMin))+m_nMin;
 }
 CButton::OnLButtonDown(nFlags, point);
}
/********************************************************************
函数名称  : GetRange(UINT &nMax, UINT &nMin)
备注      : QQ 940446982
*********************************************************************/
void CSliderButton::GetRange(UINT &nMax, UINT &nMin)
{
 nMax=m_nMax;
 nMin=m_nMin;
}

原创粉丝点击