www.pudn.com > clking_src.rar > GuiButton.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 "GuiButton.h" 
#include "resource.h" 
#include "GuiDrawLayer.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define   OVER     0 
#define   FOCUS    1 
#define   NORMAL   2 
#define   DISABLED 3 
 
///////////////////////////////////////////////////////////////////////////// 
// CGuiButton 
 
 
CGuiButton::CGuiButton() 
{ 
	m_iAling=ALING_LEFT;  
	m_iStyle=STYLE_SEMIFLAT; 
	m_lpMsg=""; 
	m_iSelected=0; 
	m_viewImage=FALSE; 
	m_ViewText=FALSE; 
	m_iTypeButton	=TYPE_NORMAL;	//Normal by default 
	m_iMenuActivo=FALSE; 
	m_clrface=GuiDrawLayer::GetRGBColorFace(); 
	m_ReposWindow=FALSE; 
	m_bIsDark=FALSE; 
 
	/*Modified By SunZhenyu 2004/08/24, add the next 2 line */ 
	m_iStyle=STYLEXP; 
	m_ViewText=TRUE; 
} 
 
CGuiButton::~CGuiButton() 
{ 
} 
 
 
 
BEGIN_MESSAGE_MAP(CGuiButton, CButton) 
	//{{AFX_MSG_MAP(CGuiButton) 
	ON_WM_CREATE() 
	ON_WM_ERASEBKGND() 
	ON_WM_MOUSEMOVE() 
	ON_WM_LBUTTONUP() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_TIMER() 
	ON_WM_SYSCOLORCHANGE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CGuiButton message handlers 
 
 
//***************************************************************************** 
void CGuiButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)  
{ 
	// TODO: Add your code to draw the specified item 
	ICONINFO bm; 
	CSize sizeImag; 
	CBrush cb; 
	CSize SizeCad=CSize(0,0); 
	CSize pt; 
	CPoint m_point; 
	int m_Index=0; 
	ZeroMemory(&bm, sizeof(ICONINFO)); 
	CDC* pDC= CDC::FromHandle(lpDrawItemStruct->hDC); 
	CRect m_rect=&lpDrawItemStruct->rcItem; 
	UINT m_State=lpDrawItemStruct->itemState; 
	 
	//--------------------------------------------------------------------- 
	//Se obtiene la cadena del boton si tiene 
	//--------------------------------------------------------------------- 
	CString m_caption; 
	GetWindowText(m_caption); 
	//--------------------------------------------------------------------- 
	// Se dibuja el fondo segun sea el estilo 
	// si es TooBarXP 
	// si no si es un boton Normal 
	//--------------------------------------------------------------------- 
	if (m_State & ODS_SELECTED) //el boton esta presionado 
	{ 
	  if (STYLEXP == m_iStyle)  
		cb.CreateSolidBrush(m_clrface);	 
	} 
	else if(m_iSelected == 1) //el mouse esta sobre el boton 
	{ 
	  if (STYLEXP == m_iStyle)  
	  cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorBTNHigh());	 
	} 
	else //el boton esta normal 
	{ 
	  if (STYLEXP == m_iStyle)  
		cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorBTNHigh());	 
	} 
	if (STYLEXP == m_iStyle)  
	{ 
		CRect rcTemp=m_rect; 
		rcTemp.DeflateRect(2,2); 
		rcTemp.right-=2; 
		pDC->FillRect(&rcTemp,&cb);	 
	} 
	else 
	{ 
		cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace()); 
		pDC->FillRect(&m_rect,&cb);	 
	} 
	//******************************************************************** 
	int nMode = pDC->SetBkMode(TRANSPARENT); 
	if (m_caption.GetLength() > 0) 
		SizeCad=pDC->GetTextExtent(m_caption); 
	 
	//------------------------------------------------------------------- 
	//si el boton esta seleccionado, se mueve el rectangulo para dar la  
	//impresion de presion 
	//------------------------------------------------------------------- 
	if (m_State & ODS_SELECTED) 
		m_rect.bottom+=2; 
	 
	//------------------------------------------------------------------- 
	//El boton tiene una imagen 
	//------------------------------------------------------------------- 
	if (m_viewImage == TRUE) 
	{ 
		 
		if (m_State & ODS_SELECTED) 
			m_Index=2; 
		else if (m_iSelected== 1) 
			m_Index=1; 
		else 
			m_Index=0; 
		 
		if (m_hicon[m_Index]!= NULL)  
		{ 
 
			::GetIconInfo(m_hicon[m_Index], &bm); 
			sizeImag=CSize((BYTE)(bm.xHotspot * 2),(BYTE)(bm.yHotspot * 2)); 
			 
		} 
		else m_Index=-1; 
 
	} 
	 
		//--------------------------------------------------------------------- 
	//el boton tiene una imagen pero no texto 
	//--------------------------------------------------------------------- 
	if (m_viewImage == TRUE && m_ViewText== FALSE) 
	{ 
		if (m_Index != -1) 
		{ 
			int calculodify; 
			m_rect.right=m_rect.left+sizeImag.cx+5; 
			calculodify=m_rect.Height()-(sizeImag.cy); 
			calculodify/=2; 
			m_point=CPoint(2,calculodify); 
			if(m_bIsDark && m_iSelected == 1 && !(m_State & ODS_DISABLED)) 
			{ 
				CPoint p(m_point.x+1,m_point.y+1); 
				pDC->DrawState(p,sizeImag,m_hicon[m_Index],DSS_MONO,CBrush (GuiDrawLayer::GetRGBColorShadow())); 
				m_point.x-=1; m_point.y-=1; 
			} 
	 
			pDC->DrawState (m_point, sizeImag,m_hicon[m_Index],(m_State==ODS_DISABLED?DSS_DISABLED:DSS_NORMAL),CBrush (GuiDrawLayer::GetRGBColorFace())); 
		} 
 
	} 
	//----------------------------------------------------------------------- 
	//El boton tiene una imagen y ademas texto 
	//----------------------------------------------------------------------- 
	else if (m_viewImage == TRUE && m_ViewText== TRUE) 
	{ 
		int calculodifx; 
		int calculodify; 
		if (m_Index != -1) 
		{ 
			CRect rectletra; 
			calculodifx=m_rect.Width()-(sizeImag.cx); 
			calculodifx/=2; 
			calculodify=m_rect.Height()-(sizeImag.cy); 
			calculodify/=2; 
			if (m_iAling ==ALING_RIGTH) 
			{ 
				m_point=CPoint(4,calculodify); 
				if(m_bIsDark && m_iSelected == 1 && !(m_State & ODS_DISABLED)) 
				{ 
					CPoint p(m_point.x+1,m_point.y+1); 
					pDC->DrawState(p,sizeImag,m_hicon[m_Index],DSS_MONO,CBrush (GuiDrawLayer::GetRGBColorShadow())); 
					m_point.x-=1; m_point.y-=1; 
				} 
				pDC->DrawState (m_point, sizeImag,m_hicon[m_Index], 
							   (m_State==ODS_DISABLED?DSS_DISABLED:DSS_NORMAL),(CBrush*)NULL); 
				rectletra=m_rect; 
				rectletra.left+=sizeImag.cx+8; 
				pt=CSize(rectletra.top,rectletra.left); 
				if (m_State & ODS_DISABLED) 
					pDC->DrawState(pt, SizeCad, m_caption, DSS_DISABLED, TRUE, 0, (CBrush*)NULL); 
				else 
					pDC->DrawText(m_caption,rectletra,DT_SINGLELINE|DT_LEFT|DT_VCENTER); 
			} 
			else 
			{ 
				rectletra=m_rect; 
				rectletra.left+=4; 
				/* Modified By Sunzhenyu, 2003/8/8, Added the next 1 line 
				*/ 
				m_point=CPoint(4,calculodify); 
				if(m_bIsDark && m_iSelected == 1 && !(m_State & ODS_DISABLED)) 
				{	 
					CPoint p=CPoint(m_point.x+1,m_point.y+1); 
					pDC->DrawState(p,sizeImag,m_hicon[m_Index],DSS_MONO,CBrush (GuiDrawLayer::GetRGBColorShadow())); 
					m_point.x-=1; m_point.y-=1; 
				} 
				pt=CSize(rectletra.top,rectletra.left); 
				if (m_State & ODS_DISABLED) 
					pDC->DrawState(pt, SizeCad, m_caption, DSS_DISABLED, TRUE, 0, (CBrush*)NULL); 
				else 
					pDC->DrawText(m_caption,rectletra,DT_SINGLELINE|DT_LEFT|DT_VCENTER); 
					m_point=CPoint((rectletra.right-sizeImag.cx)-4,calculodify); 
					pDC->DrawState (m_point, sizeImag,m_hicon[m_Index],(m_State==ODS_DISABLED?DSS_DISABLED:DSS_NORMAL),(CBrush*)NULL); 
					 
				 
			} 
		} 
  
	} 
	//----------------------------------------------------------------------- 
	//Si el texto es visible 
	//----------------------------------------------------------------------- 
	else if (m_ViewText== TRUE) 
	{ 
		CSize sz=pDC->GetTextExtent(m_caption); 
		int ntempcx=m_rect.Width()-sz.cx; 
		int ntempcy=m_rect.Height()-sz.cy; 
		pt=CSize(m_rect.left+(ntempcx/2),m_rect.top+(ntempcy/2)); 
		if (m_State & ODS_DISABLED) 
			pDC->DrawState(pt, SizeCad, m_caption, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL); 
		else 
			pDC->DrawText(m_caption,m_rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER); 
	} 
	m_rect=&lpDrawItemStruct->rcItem; 
 
	//----------------------------------------------------------------- 
	//se inicia el dibujo de bordes  
	//1) si es semiflat 
	//2) si es Flat 
	//3) si es estilo ToolBarXp   
	//4) si es estilo 3d 
	//----------------------------------------------------------------- 
	if (m_State & ODS_SELECTED) 
	{ 
		if (STYLE_SEMIFLAT== m_iStyle) 
			pDC->Draw3dRect(m_rect,GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorBTNHigh()); 
		else if (STYLE_FLAT==m_iStyle) 
			pDC->Draw3dRect(m_rect, GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorBTNHigh()); 
		else if(STYLEXP == m_iStyle) 
			DrawBottonXP(pDC,m_rect,NORMAL); 
		else	//si es 3d 
		{ 
			pDC->Draw3dRect(m_rect, GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorBTNHigh()); 
			CPen cp(PS_SOLID,1,GuiDrawLayer::GetRGBColorShadow()); 
			CPen* cpa=pDC->SelectObject(&cp); 
			pDC->MoveTo(m_rect.left+1,m_rect.top+1); 
			pDC->LineTo(m_rect.right-1,m_rect.top+1); 
			pDC->SelectObject(cpa); 
		} 
	}	 
	//----------------------------------------------------------------------- 
	//el boton esta presionado 
	//----------------------------------------------------------------------- 
	else if (m_iSelected == 1)  //el mouse esta sobre el boton 
	{ 
 
		if (STYLE_SEMIFLAT== m_iStyle) 
			pDC->Draw3dRect(m_rect, GuiDrawLayer::GetRGBColorBTNHigh(),GuiDrawLayer::GetRGBColorShadow()); 
		else if (STYLE_FLAT==m_iStyle) 
			pDC->Draw3dRect(m_rect,GuiDrawLayer::GetRGBColorBTNHigh(), GuiDrawLayer::GetRGBColorShadow()); 
		else if(STYLEXP == m_iStyle) 
			DrawBottonXP(pDC,m_rect,OVER); 
		else	//si es 3d 
		{ 
			pDC->Draw3dRect(m_rect,GuiDrawLayer::GetRGBColorBTNHigh(), GuiDrawLayer::GetRGBColorShadow()); 
			CPen cp(PS_SOLID,1,GuiDrawLayer::GetRGBColorShadow()); 
			CPen* cpa=pDC->SelectObject(&cp); 
			pDC->MoveTo(m_rect.left+1,m_rect.bottom-2); 
			pDC->LineTo(m_rect.right-2,m_rect.bottom-2); 
			pDC->MoveTo(m_rect.right-2,m_rect.top+1); 
			pDC->LineTo(m_rect.right-2,m_rect.bottom-2); 
			pDC->SelectObject(cpa); 
		} 
	}else 
	{ 
		//----------------------------------------------------------------- 
		//el boton esta en estado normal, es decir el mouse ni lo presiona 
		//ni esta sobre el. 
		//----------------------------------------------------------------- 
		if (STYLE_3D==m_iStyle) 
		{ 
			pDC->Draw3dRect(m_rect,GuiDrawLayer::GetRGBColorBTNHigh(), GuiDrawLayer::GetRGBColorShadow()); 
			CPen cp(PS_SOLID,1,GuiDrawLayer::GetRGBColorShadow()); 
			CPen* cpa=pDC->SelectObject(&cp); 
			pDC->MoveTo(m_rect.left+1,m_rect.bottom-2); 
			pDC->LineTo(m_rect.right-2,m_rect.bottom-2); 
			pDC->MoveTo(m_rect.right-2,m_rect.top+1); 
			pDC->LineTo(m_rect.right-2,m_rect.bottom-2); 
			pDC->SelectObject(cpa); 
		} 
		else if(STYLEXP == m_iStyle) 
		{ 
			if (m_State & ODS_DISABLED) 
			{ 
				DrawBottonXP(pDC,m_rect,DISABLED); 
			} 
			else 
				if (m_State & ODS_FOCUS) 
					DrawBottonXP(pDC,m_rect,FOCUS); 
				else	 
					DrawBottonXP(pDC,m_rect,NORMAL); 
		 
		} 
		else 
			pDC->Draw3dRect(m_rect,m_clrface, m_clrface); 
	} 
	 
	pDC->SetBkMode(nMode); 
	 
} 
 
 
void CGuiButton::AutoSizeButton(BOOL m_bAutoAjust) 
{ 
	m_ReposWindow=m_bAutoAjust; 
	Invalidate(); 
	UpdateWindow(); 
} 
 
void CGuiButton::OnSysColorChange( ) 
{ 
	CButton::OnSysColorChange( ); 
	m_clrface=GuiDrawLayer::GetRGBColorXP(); 
	 
	 
} 
 
//************************************************************************* 
void CGuiButton::DrawBottonXP(CDC* pDC,CRect rc,int Estado) 
{ 
	COLORREF clrPress = ::GetSysColor (COLOR_HIGHLIGHT); 
	COLORREF clrShadow  = ::GetSysColor(COLOR_BTNSHADOW); 
	//***************************************************** 
	//dibujamos los bordes del boton 
 
	CPen cp(PS_SOLID,1,clrPress); 
	CPen cpface(PS_SOLID,1,m_clrface); 
	CPen cpsxp(PS_SOLID,1,GuiDrawLayer::GetRGBColorXP()); 
	CPen cpOver(PS_SOLID,1,RGB(255,193,111)); 
	CPen cpShadow(PS_SOLID,1,clrShadow);  
	CPen* pOld; 
	if (Estado != DISABLED) 
		pOld=pDC->SelectObject(&cp); 
	else 
		pOld=pDC->SelectObject(&cpShadow); 
	rc.right-=4; 
	rc.bottom-=2; 
	//la linea superior 
	pDC->MoveTo(rc.left+2,rc.top); 
	pDC->LineTo(rc.right-1,rc.top); 
	//linea izquierda 
	pDC->MoveTo(rc.left,rc.top+2); 
	pDC->LineTo(rc.left,rc.bottom-1); 
	//linea derecha 
	pDC->MoveTo(rc.right,rc.top+2); 
	pDC->LineTo(rc.right,rc.bottom-1); 
	//linea inferior 
	pDC->MoveTo(rc.left+2,rc.bottom); 
	pDC->LineTo(rc.right-1,rc.bottom); 
	 
	 
	if (Estado != DISABLED) 
	{	 
		//se dibuja algunas lineas para dar forma 3d 
		//linea inferior 
		pDC->SelectObject(&cpface); 
		pDC->MoveTo(rc.left+2,rc.bottom-1); 
		pDC->LineTo(rc.right-1,rc.bottom-1); 
		pDC->MoveTo(rc.right-1,rc.top+2); 
		pDC->LineTo(rc.right-1,rc.bottom-1); 
		pDC->SelectObject(&cpsxp); 
		pDC->MoveTo(rc.left+2,rc.bottom-2); 
		pDC->LineTo(rc.right-1,rc.bottom-2); 
		pDC->MoveTo(rc.right-2,rc.top+2); 
		pDC->LineTo(rc.right-2,rc.bottom-1); 
 
		//fin bordes del boton 
		//*************************************************************** 
		CRect rcBordes=rc; 
		rcBordes.left+=1; 
		rcBordes.top+=1; 
		switch(Estado) 
		{ 
		case OVER: 
			pDC->Draw3dRect(rcBordes,RGB(255,202,130),RGB(255,193,111)); 
			rcBordes.DeflateRect(1,1); 
			pDC->Draw3dRect(rcBordes,RGB(255,202,130),RGB(255,193,111)); 
			break; 
		case FOCUS: 
			pDC->Draw3dRect(rcBordes,GuiDrawLayer::GetRGBFondoXP(),GuiDrawLayer::GetRGBFondoXP()); 
			rcBordes.DeflateRect(1,1); 
			pDC->Draw3dRect(rcBordes,GuiDrawLayer::GetRGBFondoXP(),GuiDrawLayer::GetRGBFondoXP()); 
			break; 
		} 
		//**************************************************************** 
		//pintar los vertices 
		//left,top 
		pDC->SetPixel(rc.left+1,rc.top,Estado != DISABLED?GuiDrawLayer::GetRGBFondoXP():clrShadow); 
		pDC->SetPixel(rc.left,rc.top+1,Estado != DISABLED?GuiDrawLayer::GetRGBFondoXP():clrShadow); 
		pDC->SetPixel(rc.left+1,rc.top+1,Estado != DISABLED?clrPress:clrShadow);	 
		//pintar los vertices 
		//left,bottom 
		pDC->SetPixel(rc.left+1,rc.bottom,Estado != DISABLED?GuiDrawLayer::GetRGBFondoXP():clrShadow); 
		pDC->SetPixel(rc.left,rc.bottom-1,Estado != DISABLED?GuiDrawLayer::GetRGBFondoXP():clrShadow); 
		pDC->SetPixel(rc.left+1,rc.bottom-1,Estado != DISABLED?clrPress:clrShadow);	 
		//right,top 
		pDC->SetPixel(rc.right-1,rc.top,Estado != DISABLED?GuiDrawLayer::GetRGBFondoXP():clrShadow); 
		pDC->SetPixel(rc.right,rc.top+1,Estado != DISABLED?GuiDrawLayer::GetRGBFondoXP():clrShadow); 
		pDC->SetPixel(rc.right-1,rc.top+1,Estado != DISABLED?clrPress:clrShadow);	 
		//right,bottom 
		pDC->SetPixel(rc.right-1,rc.bottom,Estado != DISABLED?GuiDrawLayer::GetRGBFondoXP():clrShadow); 
		pDC->SetPixel(rc.right,rc.bottom-1,Estado != DISABLED?GuiDrawLayer::GetRGBFondoXP():clrShadow); 
		pDC->SetPixel(rc.right-1,rc.bottom-1,Estado != DISABLED?clrPress:clrShadow);	 
	}	 
	pDC->SelectObject(pOld); 
 
 
 
 
 
} 
 
//***************************************************************************** 
void CGuiButton::SetColor(COLORREF m_clrFaces) 
{ 
	m_clrface=m_clrFaces; 
	 
} 
 
//***************************************************************************** 
void CGuiButton::ShowImage( BOOL m_viewimage) 
{ 
	m_viewImage=m_viewimage;	 
	CalLayout(); 
} 
//***************************************************************************** 
void CGuiButton::ShowText( BOOL m_viewText) 
{ 
	m_ViewText=m_viewText;	 
	CalLayout(); 
			 
} 
//***************************************************************************** 
void CGuiButton::CalLayout() 
{ 
	CString m_str; 
	CRect m_rect; 
	CSize sizeImag=CSize(0,0); 
	int m_High=0; 
	if (GetSafeHwnd() == NULL) return; 
	GetWindowText(m_str); 
	CClientDC dc(this); 
	ICONINFO bm; 
	ZeroMemory(&bm, sizeof(ICONINFO)); 
	GetClientRect(&m_rect); 
	CSize SizeCad=CSize(0,0); 
	if (m_viewImage == TRUE) 
		if (m_hicon[0]!= NULL) 
		{ 
			::GetIconInfo(m_hicon[0], &bm); 
			sizeImag=CSize((BYTE)(bm.xHotspot * 2),(BYTE)(bm.yHotspot * 2)); 
		} 
	if ( m_ViewText == TRUE) 
		if (m_str.GetLength() > 0) 
		{ 
			SizeCad=dc.GetTextExtent(m_str); 
			SizeCad.cx-=7; 
		} 
	m_High=max(sizeImag.cy,SizeCad.cy); 
	m_High=max(m_High,m_rect.Height()); 
	m_szButton= CSize(SizeCad.cx+sizeImag.cx+7,m_High); 
	if (m_ReposWindow==TRUE) 
		SetWindowPos (NULL, 0, 0, SizeCad.cx+sizeImag.cx+10, m_High, 
			SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); 
	 
} 
 
 
//***************************************************************************** 
CSize CGuiButton::GetSizeButton() 
{ 
	m_ReposWindow=FALSE; 
	CalLayout(); 
	m_ReposWindow=TRUE; 
	return m_szButton; 
} 
 
//***************************************************************************** 
 
 
void CGuiButton::SetImage(HICON hIcon) 
{ 
	m_hicon[0] =hIcon; 
	m_hicon[1] =hIcon; 
	m_hicon[2] =hIcon; 
	ShowImage( TRUE); 
} 
 
BOOL CGuiButton::SetImage(UINT uBitmapNormal,UINT uBitmapFocus,UINT uBitmapPush) 
{ 
	BOOL result; 
	 
	HINSTANCE hirc = AfxFindResourceHandle(MAKEINTRESOURCE(uBitmapNormal), RT_BITMAP); 
 
	if (uBitmapNormal != -1)  
	{ 
		m_hicon[0] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapNormal), IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS); 
		result=TRUE; 
		 
	} 
	else 
		result=FALSE; 
	if (uBitmapFocus != -1) 
	{ 
		m_hicon[1] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapFocus), IMAGE_ICON, 16,16, LR_LOADMAP3DCOLORS); 
		if (m_hicon[1] == NULL && m_hicon[0]!= NULL) 
			m_hicon[1] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapNormal), IMAGE_ICON, 16,16, LR_LOADMAP3DCOLORS); 
	} 
	else 
	{ 
		if (m_hicon[0]!= NULL) 
			m_hicon[1] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapNormal), IMAGE_ICON, 16,16, LR_LOADMAP3DCOLORS); 
	} 
	if (uBitmapPush != -1) 
	{ 
		m_hicon[2] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapFocus), IMAGE_ICON, 16,16, LR_LOADMAP3DCOLORS); 
		if (m_hicon[2] == NULL && m_hicon[0]!= NULL) 
			m_hicon[2] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapNormal), IMAGE_ICON, 16,16, LR_LOADMAP3DCOLORS); 
	} 
	else 
	{ 
		if (m_hicon[0]!= NULL) 
			m_hicon[2] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapNormal), IMAGE_ICON, 16,16, LR_LOADMAP3DCOLORS|LR_LOADTRANSPARENT); 
	} 
		 
	CalLayout(); 
	return result; 
} 
 
//***************************************************************************** 
void CGuiButton::SetToolTip(LPCTSTR lpMsg) 
{ 
	CRect rc; 
	m_lpMsg=lpMsg; 
	if (GetSafeHwnd ()== NULL) return; 
	if (m_lpMsg != NULL) 
	{ 
		if (m_ToolTipCtrl.GetSafeHwnd () == NULL)  
		{ 
			m_ToolTipCtrl.Create(this,TTS_ALWAYSTIP); 
			m_ToolTipCtrl.Activate(TRUE); 
			m_ToolTipCtrl.AddTool(this,lpMsg); 
		} 
		else 
		{ 
			m_ToolTipCtrl.UpdateTipText(lpMsg,this);	 
		} 
	} 
	else 
	{ 
		if (m_ToolTipCtrl.GetSafeHwnd () == NULL)  
		{ 
			m_ToolTipCtrl.Create(this,TTS_ALWAYSTIP); 
			m_ToolTipCtrl.AddTool(this,lpMsg); 
		} 
		else 
			m_ToolTipCtrl.UpdateTipText(lpMsg,this);	 
		m_ToolTipCtrl.Activate(FALSE); 
	} 
	 
	 
	 
} 
 
//***************************************************************************** 
void CGuiButton::SetCaption(LPCSTR lpMsg) 
{ 
	SetWindowText(lpMsg); 
	m_ViewText=TRUE; 
	CalLayout(); 
	Invalidate(); 
} 
 
	 
 
//***************************************************************************** 
void CGuiButton::SetTypeButton(TypeButton m_TypeButton) 
{ 
	m_iTypeButton=m_TypeButton; 
	if (m_iTypeButton == TYPE_ARROW) 
	{ 
		m_iStyleArrow=ARROW_RIGHT; 
		m_iAling=ALING_LEFT; 
		m_iTypeButton	=TYPE_ARROW; 
		m_iStyle=STYLE_3D; 
		m_lpMsg=""; 
		m_iSelected=0; 
		m_viewImage=TRUE; 
		m_ViewText=TRUE; 
		SetAlingArrow(ARROW_RIGHT); 
	 
	} 
 
} 
 
//***************************************************************************** 
 
void CGuiButton::SetAlingArrow(StyleArrow m_AlingArron) 
{ 
	 
	if (m_iTypeButton == TYPE_ARROW) 
	{ 
		m_iStyleArrow=m_AlingArron; 
		 
		if (m_iStyleArrow==ARROW_RIGHT) 
		{ 
			if (m_hicon[0]== NULL) 
				m_hicon[0]=GuiDrawLayer::LoadIconLib(IDI_ARROWRIGHT); 
			else 
			{ 
				 
				m_hicon[0]=GuiDrawLayer::LoadIconLib(IDI_ARROWRIGHT); 
				m_hicon[1]=GuiDrawLayer::LoadIconLib(IDI_ARROWRIGHT); 
				m_hicon[2]=NULL; 
			} 
		} 
		else 
		{ 
			if (m_hicon[0] == NULL) 
				m_hicon[0]=GuiDrawLayer::LoadIconLib(IDI_ARROWDOWN);		 
			else 
			{ 
				m_hicon[0]=GuiDrawLayer::LoadIconLib(IDI_ARROWDOWN);		 
				m_hicon[1]=GuiDrawLayer::LoadIconLib(IDI_ARROWDOWN); 
				m_hicon[2]=NULL; 
			} 
			 
		} 
	} 
} 
 
//***************************************************************************** 
void CGuiButton::SetStyleBorder(Style m_Style) 
{ 
	m_iStyle=m_Style; 
} 
 
//***************************************************************************** 
void CGuiButton::SetAlingMsg(AlingMsg m_AlingMsg) 
{ 
	if (m_iTypeButton == TYPE_NORMAL) 
		m_iAling=m_AlingMsg; 
} 
 
//***************************************************************************** 
int CGuiButton::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CButton::OnCreate(lpCreateStruct) == -1) 
		return -1; 
 
	return 0; 
} 
 
//***************************************************************************** 
BOOL CGuiButton::OnEraseBkgnd(CDC* pDC)  
{ 
	return TRUE; 
} 
 
//***************************************************************************** 
void CGuiButton::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	CRect m_rect; 
	GetClientRect(&m_rect); 
	if (m_rect.PtInRect(point)) 
	{ 
		if (m_iSelected == 1) return; 
		m_iSelected =1; 
		Invalidate(); 
		UpdateWindow(); 
	 
		SetTimer(1,10,NULL); 
	} 
 
	CButton::OnMouseMove(nFlags, point); 
} 
 
//***************************************************************************** 
void CGuiButton::PreSubclassWindow()  
{ 
	ModifyStyle(0,BS_OWNERDRAW); 
	CButton::PreSubclassWindow(); 
} 
 
 
//***************************************************************************** 
void CGuiButton::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	/*Modified By SunZhenyu 2004/08/24, rewrite this function */ 
	 
	/* Old 
	CButton::OnLButtonUp(nFlags, point); 
 
	if (m_iSelected == 1) m_iSelected = 0; 
	Invalidate (); 
	UpdateWindow (); 
	*/ 
 
	if (m_iSelected == 1) m_iSelected = 0; 
	Invalidate (); 
	UpdateWindow (); 
 
	CButton::OnLButtonUp(nFlags, point); 
} 
 
//***************************************************************************** 
void CGuiButton::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	/*Modified By SunZhenyu 2004/08/24, rewrite this function */ 
 
	/* Old 
	CButton::OnLButtonDown(nFlags, point); 
 
	Invalidate(); 
	UpdateWindow(); 
	if (m_iTypeButton == TYPE_ARROW) 
	{ 
		SetFocus (); 
		ShowMenu(); 
	} 
	*/ 
 
	Invalidate(); 
	UpdateWindow(); 
	if (m_iTypeButton == TYPE_ARROW) 
	{ 
		SetFocus (); 
		ShowMenu(); 
	} 
	 
	CButton::OnLButtonDown(nFlags, point); 
} 
 
void CGuiButton::SetPopupMenu(CMenu* pMenu) 
{ 
	m_pMenu=pMenu; 
} 
 
//***************************************************************************** 
void CGuiButton::ShowMenu() 
{ 
	CRect rcW; 
	int x,y; 
	GetWindowRect(&rcW); 
	if (m_iStyleArrow==ARROW_RIGHT) 
	{ 
		x=rcW.right+1; 
		y=rcW.top; 
	} 
	else 
	{ 
		x=rcW.left; 
		y=rcW.bottom; 
	} 
	 
	if (m_pMenu->GetSafeHmenu() != NULL && m_iMenuActivo==FALSE) 
	{ 
	    m_iMenuActivo=TRUE;	 
		int m_iResMenu=m_pMenu->GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD,  
												x, y,  GetParent(), NULL); 
		if (m_iResMenu!=0) 
		{ 
			CWnd* pParent= GetParent(); 
			pParent->SendMessage (	WM_COMMAND,MAKEWPARAM (GetDlgCtrlID (), BN_CLICKED),(LPARAM) m_hWnd); 
		} 
		m_iMenuActivo=FALSE; 
	} 
	else 
		return; 
	ReleaseCapture(); 
	 
} 
 
//***************************************************************************** 
BOOL CGuiButton::PreTranslateMessage(MSG* pMsg)  
{ 
	if (pMsg->message==WM_MOUSEMOVE) 
		if (m_ToolTipCtrl.GetSafeHwnd()) 
			m_ToolTipCtrl.RelayEvent(pMsg); 
	return CButton::PreTranslateMessage(pMsg); 
} 
 
//***************************************************************************** 
void CGuiButton::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	if (nIDEvent == 1) 
	{ 
		CRect m_rect; 
		CPoint pt(GetMessagePos()); 
		ScreenToClient(&pt); 
		GetClientRect(m_rect); 
		 
		if (!m_rect.PtInRect(pt)) 
		{ 
			m_iSelected=0; 
			Invalidate(); 
			UpdateWindow(); 
			KillTimer(1); 
		} 
	 
	} 
	CButton::OnTimer(nIDEvent); 
}