自己写的VC滑块类(直接继承滑块类不是继承CBuTTon类)

来源:百度文库 编辑:神马文学网 时间:2024/03/29 18:26:27

/*******************************************************************************
    文件名称 : 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 "YPlayer.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)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
void CSliderButton::SetBitmap(UINT nBkgnd, UINT nSlide)
{
 m_nBkgnd=nBkgnd;
 nSlide=m_nSlide;
 Invalidate();
}
/********************************************************************
函数名称  : SetDefaultCursor()
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
void CSliderButton::SetDefaultCursor()
{
 m_hCursor=LoadCursor(NULL,MAKEINTRESOURCE(32649));
}
/********************************************************************
函数名称  : SetRange(UINT nMin, UINT nMax)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
void CSliderButton::SetRange(UINT nMin, UINT nMax)
{
 m_nMin=nMin;
 m_nMax=nMax;
 AdjustPosition();
 Invalidate();
}
/********************************************************************
函数名称  : SetSlidePos(UINT nPos)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
void CSliderButton::SetSlidePos(UINT nPos)
{
 m_nCurrentPos=nPos;
 Invalidate();
}
/********************************************************************
函数名称  : DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
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()
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
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)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
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)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
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)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
void CSliderButton::SetButtonCursor(HCURSOR hCursor)
{
 m_hCursor=hCursor;
}
/********************************************************************
函数名称  : DrawBackground(CDC*pDC)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
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)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
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)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
void CSliderButton::SetToolTipText(CString strText)
{
 m_ToolTip.UpdateTipText(strText,this,ID_TIP);
}
/********************************************************************
函数名称  :nit(UINT nBkgndID, UINT nSlideID, UINT nMax, UINT nMin, CString strTipText)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
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)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
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()
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
UINT CSliderButton::GetSlidePos()
{
 return m_nCurrentPos;
}
/********************************************************************
函数名称  :AdjustPosition()
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
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)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
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)
函数描述  : ???
输入参数  : ???
输出参数  : void
返回值    : void
备注      : ???
*********************************************************************/
void CSliderButton::GetRange(UINT &nMax, UINT &nMin)
{
 nMax=m_nMax;
 nMin=m_nMin;
}

用时,拖入按钮资源,修改为自己画属性,用这个类关联对象,然后调用Init(UINT nBkgndID,UINT nSlideID,CString strTipText);函数。参数nBkgndID是滑条位图ID,参数nSlideID是滑头位图ID,参数strTipText热点时显示控件功能;按钮会跟着图片大小变化。确定按钮位置:CRect rect; rect.right=横坐标终点值;rect.bottom=纵坐标终点值; rect.left=横坐标起点值; rect.top=纵坐标起点值;,然后调用MoveWindow(&rect,TRUE);函数,就把按钮移到自己要的位置了。