www.pudn.com > GOS.rar > GButton.cpp


// GButton.cpp: implementation of the GButton class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "..\stdafx.h" 
#include "GButton.h" 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
GButton::GButton() 
{ 
	m_nStyle=0; 
	m_nState=0; 
} 
 
GButton::~GButton() 
{ 
 
} 
 
//消息处理函数 
void GButton::WndProc(int nMessage, int wParam, int lParam) 
{ 
	switch(nMessage) 
	{ 
	case WM_PAINT: 
		if(wParam & ODA_EDGE)OnNcPaint(); 
		if(wParam & ~ODA_EDGE)OnPaint(); 
		break; 
	case WM_LBUTTONDOWN: 
		m_nState |= ODS_GRAYED; 
		PostMessage(WM_PAINT,ODA_CLIENT,-1); 
		break; 
	case WM_LBUTTONUP: 
		m_nState &= ~ODS_GRAYED; 
		nMessage=PtInRect(wParam,lParam,m_rectWnd); 
		switch(m_nStyle & 0x0f) 
		{ 
		case BS_PUSHBUTTON: 
			SetCheck(0); 
			break; 
		case BS_CHECKBOX: 
			if(nMessage)SetCheck(-1); 
			else PostMessage(WM_PAINT,ODA_CLIENT,-1); 
			break; 
		case BS_RADIOBUTTON: 
			if(nMessage)SetCheck(1); 
			else PostMessage(WM_PAINT,ODA_CLIENT,-1); 
			break; 
		case BS_OWNERDRAW: 
			PostMessage(WM_PAINT,ODA_CLIENT,-1); 
		} 
		if(nMessage && m_pParent) 
		{ 
			m_pParent->PostMessage(WM_COMMAND,(int)this,BN_CLICKED); 
		} 
		break; 
	case WM_MOVE: 
		OnMove(); 
		break; 
	case WM_CREATE: 
		OnCreate(); 
		break; 
	default: 
		break; 
	} 
} 
 
void GButton::OnPaint() 
{ 
	switch(m_nStyle & 0x0f) 
	{ 
	case BS_PUSHBUTTON: 
		if(m_nStyle & BS_LINKLIKE)DrawLinkButton(); 
		else DrawButton(); 
		break; 
	case BS_CHECKBOX: 
	case BS_RADIOBUTTON: 
		if(m_nStyle & BS_PUSHLIKE)DrawButton(); 
		else DrawCheckBox(); 
		break; 
	case BS_OWNERDRAW: 
		m_pParent->WndProc(WM_DRAWITEM,(int)this,m_nState); 
		break; 
	} 
} 
 
 
void GButton::DrawButton() 
{ 
	int c=m_nForeColor; 
	RECT r=m_Rect; 
 
	if(m_nStyle & WS_FLAT) 
	{ 
		m_nForeColor=EdgeRGB(255); 
		Rectangle(r); 
	} 
	else if(m_nStyle & BS_FLAT) 
	{ 
		if(m_nState & (ODS_CHECKED|ODS_GRAYED)) 
		{ 
			Draw3dRect(r,EdgeRGB(128),EdgeRGB(255)); 
		} 
		else 
		{ 
			Draw3dRect(r,EdgeRGB(255),EdgeRGB(128)); 
		} 
	} 
	else 
	{ 
		if(m_nState & (ODS_CHECKED|ODS_GRAYED)) 
		{ 
			m_nForeColor=EdgeRGB(0); 
			Rectangle(r); 
			m_nForeColor=EdgeRGB(128); 
			r.left+=1;r.right-=1; 
			r.top+=1;r.bottom-=1; 
			Rectangle(r); 
		} 
		else 
		{ 
			DrawEdge(r,EDGE_RAISED); 
			r.left+=1;r.right-=1; 
			r.top+=1;r.bottom-=1; 
		} 
	} 
	r.left+=1;r.right-=1; 
	r.top+=1;r.bottom-=1; 
	if(m_nBackColor!=CLR_NONE) 
	{ 
		if((m_nStyle & BS_PUSHLIKE) && (m_nState & ODS_CHECKED)) 
		{ 
			FillRect(r,RGB(255,255,255),m_nBackColor); 
		} 
		else FillRect(r,m_nBackColor); 
	} 
	r.left+=2;r.right-=2; 
	r.top+=2;r.bottom-=2; 
	if(m_nState & ODS_FOCUS) 
	{ 
		m_nForeColor=(c & CLR_MASK) | PS_DOT1; 
		Rectangle(r); 
	} 
	if(m_nState & (ODS_CHECKED|ODS_GRAYED)) 
	{ 
		r.left+=1;r.top+=1; 
	} 
	else 
	{ 
		r.right-=1;r.bottom-=1; 
	} 
	 
	m_nForeColor=c; 
	DrawText(m_strText,r,DT_CENTER|DT_VCENTER); 
} 
 
void GButton::DrawCheckBox() 
{ 
	int c=m_nForeColor; 
	RECT r,r2=m_Rect; 
	SIZE size=GetTextExtent(1); 
 
	if(m_nBackColor!=CLR_NONE)FillRect(m_Rect,m_nBackColor); 
 
	r.top=(m_Rect.top+m_Rect.bottom-size.cy+2)/2; 
	r.bottom=r.top+size.cy-3; 
	r2.top=(m_Rect.top+m_Rect.bottom-size.cy)/2; 
	r2.bottom=r2.top+size.cy-1; 
	if(m_nStyle & BS_LEFTTEXT) 
	{ 
		r.right=m_Rect.right; 
		r.left=r.right-size.cy+1; 
		r2.right=r.left-size.cx; 
		r2.left=r2.right-size.cx*m_strText.GetLength()+1; 
	} 
	else 
	{ 
		r.left=m_Rect.left; 
		r.right=r.left+size.cy-3; 
		r2.left=r.right+size.cx; 
		r2.right=r2.left+size.cx*m_strText.GetLength()-1; 
	} 
	if(m_nStyle & (WS_FLAT|BS_FLAT)) 
	{ 
		m_nForeColor=EdgeRGB(255); 
		Rectangle(r); 
		r.left+=1;r.right-=1; 
		r.top+=1;r.bottom-=1; 
		Rectangle(r); 
	} 
	else 
	{ 
		DrawEdge(r,EDGE_SUNKEN); 
		r.left+=2;r.right-=2; 
		r.top+=2;r.bottom-=2; 
	} 
	if(m_nState & ODS_GRAYED) 
	{ 
		FillRect(r,RGB(192,192,192)); 
	} 
	else FillRect(r,RGB(255,255,255)); 
	if(m_nState & ODS_CHECKED) 
	{ 
		r.left+=2;r.top+=2; 
		r.right-=2;r.bottom-=2; 
		Draw3dRect(r,RGB(192,192,192),RGB(128,128,128)); 
		r.left+=1;r.top+=1; 
		r.right-=1;r.bottom-=1; 
		FillRect(r,c); 
	} 
	m_nForeColor=(m_nState & ODS_FOCUS)?(c & CLR_MASK)|PS_DOT1:(m_nBackColor & CLR_MASK); 
	r.left=r2.left-size.cx/2;r.top=r2.top-1; 
	r.right=r2.right+size.cx/2;r.bottom=r2.bottom+1; 
	Rectangle(r); 
	 
	m_nForeColor=c; 
	DrawText(m_strText,r2,DT_CENTER|DT_VCENTER); 
} 
 
void GButton::DrawLinkButton() 
{ 
	int c; 
	RECT r; 
	SIZE size=GetTextExtent(1); 
 
	r.top=(m_Rect.top+m_Rect.bottom-size.cy-4)/2; 
	r.bottom=r.top+size.cy+3; 
	c=size.cx*m_strText.GetLength()+4; 
	r.left=(m_Rect.left+m_Rect.right-c)/2; 
	r.right=r.left+c+1; 
	c=m_nForeColor; 
 
	if(m_nBackColor!=CLR_NONE)FillRect(m_Rect,m_nBackColor); 
	if(m_nState & (ODS_CHECKED | ODS_GRAYED)) 
	{ 
		Draw3dRect(r,EdgeRGB(128),EdgeRGB(255)); 
	} 
	else if(m_nState & ODS_FOCUS) 
	{ 
		m_nForeColor=EdgeRGB(192) | PS_DOT1; 
		Rectangle(r); 
	} 
	m_nForeColor=c & CLR_MASK; 
	Line(r.left+2,r.bottom-1,r.right-2,r.bottom-1); 
	m_nForeColor=c; 
	DrawText(m_strText,m_Rect,DT_CENTER|DT_VCENTER); 
 
	m_nForeColor=c; 
} 
 
void GButton::SetCheck(BOOL bCheck) 
{ 
	switch(m_nStyle & 0x0f) 
	{ 
	case BS_RADIOBUTTON: 
	{ 
		if(!(m_nState & ODS_CHECKED)) 
		{ 
			int i; 
			for(i=m_nWndIndex+1;im_pParent!=m_pParent)break; 
				if(m_aWnd[i]->m_nStyle & WS_GROUP)break; 
				if(m_aWnd[i]->m_nStyle & BS_RADIOBUTTON) 
				{ 
					if(m_aWnd[i]->m_nState & ODS_CHECKED) 
					{ 
						m_aWnd[i]->m_nState &= ~ODS_CHECKED; 
						m_aWnd[i]->PostMessage(WM_PAINT,ODA_CLIENT,-1); 
						i=-1; 
						break; 
					} 
				} 
			} 
			i=(i==-1 || (m_nStyle & WS_GROUP))?-1:m_nWndIndex-1; 
			for(;i>=0;i--) 
			{ 
				if(m_aWnd[i]->m_pParent!=m_pParent)break; 
				if(m_aWnd[i]->m_nStyle & BS_RADIOBUTTON) 
				{ 
					if(m_aWnd[i]->m_nState & ODS_CHECKED) 
					{ 
						m_aWnd[i]->m_nState &= ~ODS_CHECKED; 
						m_aWnd[i]->PostMessage(WM_PAINT,ODA_CLIENT,-1); 
						break; 
					} 
				} 
				if(m_aWnd[i]->m_nStyle & WS_GROUP)break; 
			} 
			m_nState |= ODS_CHECKED; 
			PostMessage(WM_PAINT,ODA_CLIENT,-1); 
		} 
	} 
	default: 
		if(bCheck<0)bCheck=(m_nState & ODS_CHECKED)?0:1; 
		if(bCheck)m_nState |= ODS_CHECKED; 
		else m_nState &= ~ODS_CHECKED; 
		PostMessage(WM_PAINT,ODA_CLIENT,-1); 
	} 
} 
 
BOOL GButton::GetCheck() 
{ 
	return (m_nState & ODS_CHECKED)?TRUE:FALSE; 
} 
 
void GButton::OnCreate() 
{ 
 
}