www.pudn.com > ODBCApi.rar > ShadeButtonST.cpp


#include "stdafx.h" 
#include "ShadeButtonST.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
CShadeButtonST::CShadeButtonST() 
{ 
} 
 
CShadeButtonST::~CShadeButtonST() 
{ 
} 
 
void CShadeButtonST::SetShade(UINT shadeID, BYTE granularity, BYTE highlight, BYTE coloring, COLORREF color) 
{ 
	long	sXSize,sYSize,bytes,j,i,k,h; 
	BYTE	*iDst ,*posDst; 
	 
	RECT rect; 
	GetWindowRect(&rect); 
	sYSize=rect.bottom-rect.top; 
	sXSize=rect.right-rect.left ; 
 
	m_dh.Create(max(1,sXSize /*-2*m_FocusRectMargin-1*/ ),1,8);	//create the horizontal focus bitmap 
	m_dv.Create(1,max(1,sYSize /*-2*m_FocusRectMargin*/),8);	//create the vertical focus bitmap 
 
	m_dNormal.Create(sXSize,sYSize,8);					//create the default bitmap 
 
	COLORREF hicr=GetSysColor(COLOR_BTNHIGHLIGHT);		//get the button base colors 
	COLORREF midcr=GetSysColor(COLOR_BTNFACE); 
	COLORREF locr=GetSysColor(COLOR_BTNSHADOW); 
	long r,g,b;											//build the shaded palette 
	for(i=0;i<129;i++){ 
		r=((128-i)*GetRValue(locr)+i*GetRValue(midcr))/128; 
		g=((128-i)*GetGValue(locr)+i*GetGValue(midcr))/128; 
		b=((128-i)*GetBValue(locr)+i*GetBValue(midcr))/128; 
		m_dNormal.SetPaletteIndex((BYTE)i,(BYTE)r,(BYTE)g,(BYTE)b); 
		m_dh.SetPaletteIndex((BYTE)i,(BYTE)r,(BYTE)g,(BYTE)b); 
		m_dv.SetPaletteIndex((BYTE)i,(BYTE)r,(BYTE)g,(BYTE)b); 
	} 
	for(i=1;i<129;i++){ 
		r=((128-i)*GetRValue(midcr)+i*GetRValue(hicr))/128; 
		g=((128-i)*GetGValue(midcr)+i*GetGValue(hicr))/128; 
		b=((128-i)*GetBValue(midcr)+i*GetBValue(hicr))/128; 
		m_dNormal.SetPaletteIndex((BYTE)(i+127),(BYTE)r,(BYTE)g,(BYTE)b); 
		m_dh.SetPaletteIndex((BYTE)(i+127),(BYTE)r,(BYTE)g,(BYTE)b); 
		m_dv.SetPaletteIndex((BYTE)(i+127),(BYTE)r,(BYTE)g,(BYTE)b); 
	} 
 
	m_dNormal.BlendPalette(color,coloring);	//color the palette 
 
	iDst=m_dh.GetBits();		//build the horiz. dotted focus bitmap 
	j=(long)m_dh.GetWidth(); 
	for(i=0;i0)&&((y+i)0)) 
					m_dNormal.SetPixelIndex(sXSize-x+i,y-i,(BYTE)d); 
			} 
		} 
		//blend strokes with SHS_DIAGONAL 
		posDst =iDst; 
		a=(idxmax-idxmin-k)/2; 
		for(i = 0; i < sYSize; i++) { 
			for(j = 0; j < sXSize; j++) { 
				d=posDst[j]+((a*i)/sYSize+(a*(sXSize-j))/sXSize); 
				posDst[j]=(BYTE)d; 
				posDst[j]+=rand()/grainx2; 
			} 
			posDst+=bytes; 
		} 
 
		break; 
//---------------------------------------------------- 
	case 7:	// SHS_HARDBUMP 
		//set horizontal bump 
		for(i = 0; i < sYSize; i++) { 
			k=(255*i/sYSize)-127; 
			k=(k*(k*k)/128)/128; 
			k=(k*(128-granularity*2))/128+128; 
			for(j = 0; j < sXSize; j++) { 
				posDst[j]=(BYTE)k; 
				posDst[j]+=rand()/grainx2-granularity; 
			} 
			posDst+=bytes; 
		} 
		//set vertical bump 
		d=min(16,sXSize/6);	//max edge=16 
		a=sYSize*sYSize/4; 
		posDst =iDst; 
		for(i = 0; i < sYSize; i++) { 
			y=i-sYSize/2; 
			for(j = 0; j < sXSize; j++) { 
				x=j-sXSize/2; 
				xs=sXSize/2-d+(y*y*d)/a; 
				if (x>xs) posDst[j]=idxmin+(BYTE)(((sXSize-j)*128)/d); 
				if ((x+xs)<0) posDst[j]=idxmax-(BYTE)((j*128)/d); 
				posDst[j]+=rand()/grainx2-granularity; 
			} 
			posDst+=bytes; 
		} 
		break; 
//---------------------------------------------------- 
	case 6: //SHS_SOFTBUMP 
		for(i = 0; i < sYSize; i++) { 
			h=(255*i/sYSize)-127; 
			for(j = 0; j < sXSize; j++) { 
				k=(255*(sXSize-j)/sXSize)-127; 
				k=(h*(h*h)/128)/128+(k*(k*k)/128)/128; 
				k=k*(128-granularity)/128+128; 
				if (kidxmax) k=idxmax; 
				posDst[j]=(BYTE)k; 
				posDst[j]+=rand()/grainx2-granularity; 
			} 
			posDst+=bytes; 
		} 
		break; 
//---------------------------------------------------- 
	case 5: // SHS_VBUMP 
		for(j = 0; j < sXSize; j++) { 
			k=(255*(sXSize-j)/sXSize)-127; 
			k=(k*(k*k)/128)/128; 
			k=(k*(128-granularity))/128+128; 
			for(i = 0; i < sYSize; i++) { 
				posDst[j+i*bytes]=(BYTE)k; 
				posDst[j+i*bytes]+=rand()/grainx2-granularity; 
			} 
		} 
		break; 
//---------------------------------------------------- 
	case 4: //SHS_HBUMP 
		for(i = 0; i < sYSize; i++) { 
			k=(255*i/sYSize)-127; 
			k=(k*(k*k)/128)/128; 
			k=(k*(128-granularity))/128+128; 
			for(j = 0; j < sXSize; j++) { 
				posDst[j]=(BYTE)k; 
				posDst[j]+=rand()/grainx2-granularity; 
			} 
			posDst+=bytes; 
		} 
		break; 
//---------------------------------------------------- 
	case 1:	//SHS_DIAGSHADE 
		a=(idxmax-idxmin)/2; 
		for(i = 0; i < sYSize; i++) { 
			for(j = 0; j < sXSize; j++) { 
				posDst[j]=(BYTE)(idxmin+a*i/sYSize+a*(sXSize-j)/sXSize); 
				posDst[j]+=rand()/grainx2-granularity; 
			} 
			posDst+=bytes; 
		} 
		break; 
//---------------------------------------------------- 
	case 2:	//SHS_HSHADE 
		a=idxmax-idxmin; 
		for(i = 0; i < sYSize; i++) { 
			k=a*i/sYSize+idxmin; 
			for(j = 0; j < sXSize; j++) { 
				posDst[j]=(BYTE)k; 
				posDst[j]+=rand()/grainx2-granularity; 
			} 
			posDst+=bytes; 
		} 
		break; 
//---------------------------------------------------- 
	case 3:	//SHS_VSHADE: 
		a=idxmax-idxmin; 
		for(j = 0; j < sXSize; j++) { 
			k=a*(sXSize-j)/sXSize+idxmin; 
			for(i = 0; i < sYSize; i++) { 
				posDst[j+i*bytes]=(BYTE)k; 
				posDst[j+i*bytes]+=rand()/grainx2-granularity; 
			} 
		} 
		break; 
//---------------------------------------------------- 
	default:	//SHS_NOISE 
		for(i = 0; i < sYSize; i++) { 
			for(j = 0; j < sXSize; j++) { 
				posDst[j]=128+rand()/grainx2-granularity; 
			} 
			posDst+=bytes; 
		} 
	} 
//---------------------------------------------------- 
	m_dDisabled.Clone(&m_dNormal);	//build the other bitmaps 
	m_dOver.Clone(&m_dNormal); 
	m_dOver.BlendPalette(hicr,highlight); 
	m_dDown.Clone(&m_dOver); 
} // End of SetShade 
 
DWORD CShadeButtonST::OnDrawBackground(CDC *pDC, LPCRECT pRect) 
{ 
	if (m_bMouseOnButton) 
	{ 
		if (m_bIsPressed) 
			m_dOver.Draw(pDC->GetSafeHdc(),1,1); 
		else 
			m_dOver.Draw(pDC->GetSafeHdc(),0,0); 
	} 
	else 
		m_dNormal.Draw(pDC->GetSafeHdc(),0,0); 
 
	return BTNST_OK; 
} // End of OnDrawBackground 
 
DWORD CShadeButtonST::OnDrawBorder(CDC* pDC, LPCRECT pRect) 
{ 
	BASE_BTNST_CLASS::OnDrawBorder(pDC, pRect); 
 
	return BTNST_OK; 
} // End of OnDrawBorder