自己写的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);函数,就把按钮移到自己要的位置了。