www.pudn.com > clking_src.rar > GuiSliderCtrl.cpp


//-----------------------------------------------------------------------// 
// This is a part of the GuiLib MFC Extention.							 //	 
// Autor  :  Francisco Campos											 // 
// (C) 2002 Francisco Campos  All rights reserved     // 
// This code is provided "as is", with absolutely no warranty expressed  // 
// or implied. Any use is at your own risk.								 //		 
// You must obtain the author's consent before you can include this code // 
// in a software library.												 // 
// If the source code in  this file is used in any application			 // 
// then acknowledgement must be made to the author of this program		 //	 
// fcampos@tutopia.com													 // 
//-----------------------------------------------------------------------// 
 
 
#include "stdafx.h" 
#include "GuiSliderCtrl.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CGuiSliderCtrl 
 
/* 
typedef struct tagNMCUSTOMDRAWINFO 
	{ 
		NMHDR hdr; 
		DWORD dwDrawStage; 
		HDC hdc; 
		RECT rc; 
		DWORD dwItemSpec;  // this is control specific, but it's how to specify an item.  valid only with CDDS_ITEM bit set 
		UINT  uItemState; 
		LPARAM lItemlParam; 
	} NMCUSTOMDRAW, FAR * LPNMCUSTOMDRAW; 
 
*/ 
 
 
 
CGuiSliderCtrl::CGuiSliderCtrl() 
{ 
	bSelected=FALSE; 
	m_clrGreen=RGB(0,198,0);  //verder 
	m_clrOrange=RGB(255,193,111); //no tan naranja 
	m_Press=FALSE; 
} 
 
CGuiSliderCtrl::~CGuiSliderCtrl() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CGuiSliderCtrl, CSliderCtrl) 
	//{{AFX_MSG_MAP(CGuiSliderCtrl) 
	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw) 
 
	ON_WM_MOUSEMOVE() 
	ON_WM_TIMER() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CGuiSliderCtrl message handlers 
 
void CGuiSliderCtrl::OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	 
	LPNMCUSTOMDRAW lpcd = (LPNMCUSTOMDRAW)pNMHDR; 
	CDC*	pDC=CDC::FromHandle(lpcd->hdc); 
	CRect	rcClient=lpcd->rc; 
	UINT	dwItemSpec=lpcd->dwItemSpec; 
	DWORD	dwDrawStage=lpcd->dwDrawStage; 
	UINT    uItemState=lpcd->uItemState; 
	//bSelected= uItemState & CDIS_FOCUS ? TRUE:FALSE; 
	//------------------------------------------------ 
	//aun no se puede pintar el control 
	//------------------------------------------------ 
	if (dwDrawStage == CDDS_PREPAINT) 
	{ 
		*pResult = CDRF_NOTIFYITEMDRAW;          
		return; 
	} 
	//----------------------------------------------- 
	//intentelo ahora 
	//----------------------------------------------- 
	if (dwDrawStage == CDDS_ITEMPREPAINT) 
	{	 
		if (dwItemSpec == TBCD_TICS) 
		{ 
			*pResult = CDRF_DODEFAULT; 
			return; 
		}	 
		else if (dwItemSpec ==  TBCD_THUMB) 
		{ 
			*pResult = CDRF_SKIPDEFAULT; 
 
			if (rcClient.Height() > rcClient.Width()) 
					DrawVThumb(pDC, rcClient); 
			else 
					DrawHThumb(pDC, rcClient); 
			return; 
		} 
		else if (dwItemSpec == TBCD_CHANNEL) 
		{ 
			*pResult = CDRF_SKIPDEFAULT; 
			pDC->Draw3dRect(&rcClient,m_dl.GetRGBPressBXP(),::GetSysColor(COLOR_BTNHIGHLIGHT)); 
			return; 
		} 
	} 
	 
} 
 
void CGuiSliderCtrl::DrawHThumb(CDC* pDC,CRect rcClient) 
{ 
	//------------------------------------------ 
	//prefiero todo a pulso 
	//------------------------------------------ 
	CPen cpGreen(PS_SOLID,1,m_clrGreen); 
	CPen cpOrange(PS_SOLID,1,m_clrOrange); 
	CPen cp(PS_SOLID,1,m_dl.GetRGBPressBXP()); 
	CPen cpFondo(PS_SOLID,1,m_dl.GetRGBFondoXP()); 
	CPen cpSombra(PS_SOLID,1,RGB(225,225,225)); 
	CPen cpSombraDark(PS_SOLID,1,RGB(200,200,200)); 
	CPen* pOld; 
	CBrush cb; 
	 
	//se pinta arriba y luego por la derecha 
	//vertice left,top 
	pOld=pDC->SelectObject(&cp); 
	int nMedio=rcClient.Width()-7; 
	//------------------------------------------ 
	//pintar el fondo estilo  xp 
	//------------------------------------------ 
	rcClient.bottom--; 
	CRect m_rectTemp=rcClient; 
	m_rectTemp.right-=5; 
	cb.CreateSolidBrush(m_dl.GetRGBColorXP()); 
	pDC->FillRect(&m_rectTemp,&cb); 
	//************************************************* 
	// - 
	pDC->MoveTo(rcClient.left+1,rcClient.top); 
	pDC->LineTo(rcClient.left+nMedio,rcClient.top); 
	// | 
	pDC->MoveTo(rcClient.left,rcClient.top+1); 
	pDC->LineTo(rcClient.left,rcClient.bottom); 
 
	// - 
	pDC->MoveTo(rcClient.left+1,rcClient.bottom); 
	pDC->LineTo(rcClient.left+nMedio,rcClient.bottom); 
	//Algo de sombra 
	pDC->SelectObject(&cpSombraDark); 
	pDC->MoveTo(rcClient.left+1,rcClient.top+1); 
	pDC->LineTo(rcClient.left+nMedio,rcClient.top+1); 
 
	pDC->SelectObject(&cpSombra); 
	pDC->MoveTo(rcClient.left+1,rcClient.top+2); 
	pDC->LineTo(rcClient.left+nMedio,rcClient.top+2); 
	pDC->MoveTo(rcClient.left+1,rcClient.bottom-1); 
	pDC->LineTo(rcClient.left+nMedio,rcClient.bottom-1); 
 
	//----------------------------------------------------------- 
	//se pinta los colores de acuerdo al la seleccion del boton 
	//naranja si se selecciona y verde normal, en la parte superior 
	//----------------------------------------------------------- 
	rcClient.DeflateRect(1,1); 
	pDC->SelectObject(bSelected!=TRUE?&cpGreen:&cpOrange); 
	for (int i=0; i<3;i++) 
	{ 
		pDC->MoveTo(rcClient.left+i,rcClient.top); 
		pDC->LineTo(rcClient.left+i,rcClient.bottom+1); 
			 
	} 
	rcClient.InflateRect(1,1); 
	pDC->SelectObject(&cp); 
	//------------------------------------------------------------- 
	//se pinta la punta 
	//------------------------------------------------------------- 
	for (int y =0; y<5;y++) 
	{ 
		pDC->SetPixel(rcClient.left+nMedio+y,rcClient.top+y,m_dl.GetRGBPressBXP()); 
		pDC->SetPixel(rcClient.left+nMedio+y,rcClient.bottom-y,m_dl.GetRGBPressBXP()); 
	} 
	pDC->SetPixel(rcClient.left+nMedio+y,rcClient.bottom-y,m_dl.GetRGBPressBXP()); 
	 
	//pDC->SetPixel(rcClient.right-y,rcClient.top+nMedio+y,m_dl.GetRGBPressBXP()); 
 
	//******************************************************** 
	 
	//----------------------------------------------------------- 
	//se pinta los colores de acuerdo al la seleccion del boton 
	//naranja si se selecciona y verde normal 
	//----------------------------------------------------------- 
	pDC->SelectObject(bSelected!=TRUE?&cpGreen:&cpOrange); 
	 
	for (y =0; y<5;y++) 
	{ 
		pDC->SetPixel(rcClient.left+nMedio+y,(rcClient.top+y)+1, 
			bSelected!=TRUE?m_clrGreen:m_clrOrange); 
		pDC->SetPixel((rcClient.left+nMedio+y),(rcClient.bottom-y)-1, 
			bSelected!=TRUE?m_clrGreen:m_clrOrange); 
	} 
 
	//----------------------------------------------------------- 
	//se pinta sombra a la punta para dar un aspecto mas grueso  
	//al boton 
	//----------------------------------------------------------- 
	pDC->SelectObject(bSelected!=TRUE?&cpGreen:&cpOrange); 
	 
	for (y =0; y<4;y++) 
	{ 
		pDC->SetPixel(rcClient.left+nMedio+y,(rcClient.top+y)+2, 
			RGB(225,225,225)); 
		pDC->SetPixel(rcClient.left+nMedio+y,(rcClient.bottom-y)-2, 
			RGB(200,200,200)); 
	} 
 
	pDC->SelectObject(pOld); 
		 
} 
 
 
 
 
void CGuiSliderCtrl::DrawVThumb(CDC* pDC,CRect rcClient) 
{ 
	//------------------------------------------ 
	//prefiero todo a pulso 
	//------------------------------------------ 
	CPen cpGreen(PS_SOLID,1,m_clrGreen); 
	CPen cpOrange(PS_SOLID,1,m_clrOrange); 
	CPen cp(PS_SOLID,1,m_dl.GetRGBPressBXP()); 
	CPen cpFondo(PS_SOLID,1,m_dl.GetRGBFondoXP()); 
	CPen cpSombra(PS_SOLID,1,RGB(225,225,225)); 
	CPen cpSombraDark(PS_SOLID,1,RGB(200,200,200)); 
	CPen* pOld; 
	CBrush cb; 
	 
	//se pinta arriba y luego por la derecha 
	//vertice left,top 
	pOld=pDC->SelectObject(&cp); 
	int nMedio=rcClient.Height()-7; 
	//------------------------------------------ 
	//pintar el fondo estilo  xp 
	//------------------------------------------ 
	rcClient.right-=1; 
	rcClient.bottom++; 
	CRect m_rectTemp=rcClient; 
	m_rectTemp.bottom-=5; 
	m_rectTemp.DeflateRect(1,1); 
	cb.CreateSolidBrush(m_dl.GetRGBColorXP()); 
	pDC->FillRect(&m_rectTemp,&cb); 
	//************************************************* 
	// - 
	pDC->MoveTo(rcClient.left+1,rcClient.top); 
	pDC->LineTo(rcClient.right,rcClient.top); 
	// | 
	pDC->MoveTo(rcClient.left,rcClient.top+1); 
	pDC->LineTo(rcClient.left,rcClient.top+nMedio); 
 
	// | 
	pDC->MoveTo(rcClient.right,rcClient.top+1); 
	pDC->LineTo(rcClient.right,rcClient.top+nMedio); 
	//Algo de sombra 
	pDC->SelectObject(&cpSombraDark); 
	pDC->MoveTo(rcClient.right-1,rcClient.top+1); 
	pDC->LineTo(rcClient.right-1,rcClient.top+nMedio+2); 
 
	pDC->SelectObject(&cpSombra); 
	pDC->MoveTo(rcClient.right-2,rcClient.top+1); 
	pDC->LineTo(rcClient.right-2,rcClient.top+nMedio+2); 
	pDC->MoveTo(rcClient.left+1,rcClient.top+1); 
	pDC->LineTo(rcClient.left+1,rcClient.top+nMedio); 
 
	//----------------------------------------------------------- 
	//se pinta los colores de acuerdo al la seleccion del boton 
	//naranja si se selecciona y verde normal, en la parte superior 
	//----------------------------------------------------------- 
	rcClient.DeflateRect(1,1); 
	pDC->SelectObject(bSelected!=TRUE?&cpGreen:&cpOrange); 
	for (int i=0; i<3;i++) 
	{ 
		pDC->MoveTo(rcClient.left,rcClient.top+i); 
		pDC->LineTo(rcClient.right+1,rcClient.top+i); 
			 
	} 
	rcClient.InflateRect(1,1); 
	pDC->SelectObject(&cp); 
	//------------------------------------------------------------- 
	//se pinta la punta 
	//------------------------------------------------------------- 
	for (int y =0; y<5;y++) 
	{ 
		pDC->SetPixel(rcClient.left+y,rcClient.top+nMedio+y,m_dl.GetRGBPressBXP()); 
		pDC->SetPixel(rcClient.right-y,rcClient.top+nMedio+y,m_dl.GetRGBPressBXP()); 
	} 
	pDC->SetPixel(rcClient.right-y,rcClient.top+nMedio+y,m_dl.GetRGBPressBXP()); 
	//******************************************************** 
	 
	//----------------------------------------------------------- 
	//se pinta los colores de acuerdo al la seleccion del boton 
	//naranja si se selecciona y verde normal 
	//----------------------------------------------------------- 
	pDC->SelectObject(bSelected!=TRUE?&cpGreen:&cpOrange); 
	 
	for (y =0; y<5;y++) 
	{ 
		pDC->SetPixel((rcClient.left+y)+1,rcClient.top+nMedio+y, 
			bSelected!=TRUE?m_clrGreen:m_clrOrange); 
		pDC->SetPixel((rcClient.right-y)-1,(rcClient.top+nMedio+y), 
			bSelected!=TRUE?m_clrGreen:m_clrOrange); 
	} 
 
	//----------------------------------------------------------- 
	//se pinta sombra a la punta para dar un aspecto mas grueso  
	//al boton 
	//----------------------------------------------------------- 
	pDC->SelectObject(bSelected!=TRUE?&cpGreen:&cpOrange); 
	 
	for (y =0; y<4;y++) 
	{ 
		pDC->SetPixel((rcClient.left+y)+2,rcClient.top+nMedio+y, 
			RGB(225,225,225)); 
		pDC->SetPixel((rcClient.right-y)-2,rcClient.top+nMedio+y, 
			RGB(200,200,200)); 
	} 
 
	pDC->SelectObject(pOld); 
 
	//uff!!!, que rutina tan aburridora de hacer!!!!  
} 
 
 
void CGuiSliderCtrl::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	if (bSelected==TRUE) 
		return; 
	CRect rc; 
	GetClientRect(&rc); 
	if (rc.PtInRect(point)) 
	{ 
		bSelected=TRUE; 
		Invalidate(); 
		UpdateWindow(); 
		SetTimer(1,100,NULL); 
	} 
	CSliderCtrl::OnMouseMove(nFlags, point); 
} 
 
 
void CGuiSliderCtrl::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	CRect m_rect; 
	CPoint pt(GetMessagePos()); 
	ScreenToClient(&pt); 
	GetClientRect(m_rect); 
	if (!m_rect.PtInRect(pt)) 
	{ 
		bSelected=FALSE; 
		Invalidate(); 
		UpdateWindow(); 
		KillTimer(1); 
	} 
	CSliderCtrl::OnTimer(nIDEvent); 
} 
 
void CGuiSliderCtrl::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	if (bSelected==FALSE) 
	{ 
		bSelected=TRUE; 
		Invalidate(); 
		UpdateWindow(); 
	} 
	CSliderCtrl::OnLButtonDown(nFlags, point); 
} 
 
void CGuiSliderCtrl::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	bSelected=FALSE; 
	Invalidate(); 
	UpdateWindow(); 
	KillTimer(1); 
	CSliderCtrl::OnLButtonUp(nFlags, point); 
}