www.pudn.com > SDKSkin.rar > SkinCheckBox.h


// SkinCheckBox.h 
 
#ifndef _SKINCHECKBOX_ONCE_ 
#define _SKINCHECKBOX_ONCE_ 
 
#include "SkinButton.h" 
 
class SkinCheckBox : public SkinButton 
{ 
public: 
	SkinCheckBox() 
	{ 
	} 
	LRESULT CALLBACK SkinCBoxProc(SKINMSG &skMsg) 
	{ 
		if(skMsg._msg == WM_PAINT) 
		{ 
			PAINTSTRUCT ps; 
			HDC hDc = BeginPaint(skMsg._hWnd,&ps); 
			RNHBitmap bmCheck(SkinIni::Instance()->GetCheckBox()); 
			PaintItem(hDc,bmCheck,skMsg); 
			EndPaint(skMsg._hWnd,&ps); 
			return TRUE; 
		} 
		 
		return TransMsg(skMsg); 
	} 
 
	LRESULT PaintItem(HDC dc,RNHBitmap &bmDraw,SKINMSG &skMsg) 
	{ 
		RECT rcDraw; 
		GetWindowRect(skMsg._hWnd,&rcDraw); 
		SkinRect::ScreenToClient(skMsg._hWnd,rcDraw); 
		RNHDC  hDc(dc,false); 
		TCHAR strText[MAX_PATH + 1] = {0}; 
		UINT uCheck = (UINT)SendMessage(skMsg._hWnd,BM_GETCHECK,0,0); 
		UINT nState = (UINT)SendMessage(skMsg._hWnd,BM_GETSTATE,0,0); 
		BOOL bFocus = (nState & 0x0008); 
 
		// 取得图片 
		//RNHBitmap bmCheck(SkinIni::Instance()->GetCheckBox()); 
		int iCheckWid = bmDraw.Width() / 4; 
		int iHei = bmDraw.Height(); 
 
		RECT rcBm = rcDraw; 
		RECT rcRect = rcDraw; 
	 
		COLORREF clrRef = RGB(255,0,255); 
		bool bEnable = IsWindowEnabled(skMsg._hWnd); 
		 
		RNHBitmap bmp(DrawRadio(hDc,bmDraw,uCheck == 1,bEnable,rcBm,clrRef)); 
		 
		rcRect.left = rcBm.right; 
		 
		HRGN wnRgn = CreateRectRgn(iCheckWid,0,rcRect.right-rcRect.left,rcRect.bottom-rcRect.top); 
		HRGN hRgn = SkinRgn::ImageToRgn(hDc,bmp,clrRef); 
		 
		CombineRgn(wnRgn,wnRgn,hRgn,RGN_XOR); 
		 
		SetWindowRgn(skMsg._hWnd,wnRgn,TRUE); 
		 
		DeleteObject(hRgn); 
		hRgn = CreateRectRgn(0,0,0,0); 
		GetWindowRgn(skMsg._hWnd,hRgn); 
		::SelectClipRgn(hDc,hRgn); 
		 
		RNHDC memDc(CreateCompatibleDC(dc)); 
		HBITMAP obmp = (HBITMAP)SelectObject(memDc,bmp); 
		SkinDraw::DrawStretch(hDc,memDc,rcBm,rcBm); 
		 
		if(!bEnable) 
			SetTextColor(hDc,::GetSysColor(COLOR_GRAYTEXT));//灰色字:禁用状态 
		else 
			SetTextColor(hDc,::GetSysColor(COLOR_BTNTEXT));	//黑色字:普通状态	 
		 
		HFONT fNew = (HFONT)SendMessage(GetParent(skMsg._hWnd),WM_GETFONT,0,0); 
		HFONT fOld = 0; 
		if(fNew) 
		{ 
			fOld = (HFONT)SelectObject(hDc,fNew); 
		} 
 
		SetBkMode(hDc,TRANSPARENT); 
		int iLen = GetWindowText(skMsg._hWnd,strText,MAX_PATH); 
		SIZE size = {0,0}; 
		::GetTextExtentPoint32(hDc,strText,iLen, &size); 
		int heiOff = (rcRect.bottom-rcRect.top-size.cy)/2; 
		rcRect.top += heiOff; 
		rcRect.bottom = rcRect.top + size.cy; 
		rcRect.left += 4; 
		int iWidOff = rcRect.right-rcRect.left-size.cx; 
		if(iWidOff < 0) rcRect.left += iWidOff; 
		 
		DrawText(hDc,strText,strlen(strText),&rcRect,DT_END_ELLIPSIS|DT_SINGLELINE|DT_LEFT|DT_VCENTER); 
		 
		if(bFocus) 
		{ 
			if(iWidOff > 0) rcRect.right = rcRect.left + size.cx+2; 
			//rcRect.left += 1; 
			rcRect.top += 1; 
			rcRect.right -= 1; 
			rcRect.bottom -= 1; 
 
			DrawFocusRect(hDc,&rcRect); 
		} 
		SelectObject(hDc,fOld); 
		 
		SelectObject(memDc,obmp); 
		DeleteObject(hRgn); 
		 
		return 0L; 
	} 
 
	static LRESULT DrawCtrlItem(UINT idCtrl,LPDRAWITEMSTRUCT lpdis) 
	{ 
		bool m_bSelected,m_bFocus,m_bOver; 
		m_bSelected = m_bFocus = false; 
		m_bOver = false; 
		RECT rcDraw =  lpdis->rcItem; 
		RNHDC  hDc(lpdis->hDC); 
		UINT uState = lpdis->itemState; 
		UINT uAction = lpdis->itemAction; 
 
		UINT uCheck = (UINT)SendMessage(lpdis->hwndItem,BM_GETSTATE,0,0); 
		TCHAR strText[MAX_PATH + 1] = {0}; 
 
		// 取得图片 
		RNHBitmap bmCheck(SkinIni::Instance()->GetCheckBox()); 
		int iCheckWid = bmCheck.Width() / 4; 
		int iHei = bmCheck.Height(); 
 
		if((uState & ODS_FOCUS) == ODS_FOCUS) 
		{ 
			m_bFocus = true; 
		} 
		else 
		{ 
			m_bFocus = false; 
		} 
		if((uState & ODS_SELECTED) == ODS_SELECTED || 
			uCheck & 0X0003 || uCheck & ODS_CHECKED) 
		{ 
			m_bSelected = true; 
		} 
		else 
		{ 
			m_bSelected = false; 
		} 
 
		RECT rcBm = rcDraw; 
		RECT rcRect = rcDraw; 
		int  iOffset = rcDraw.bottom-rcDraw.top-iHei; 
		rcBm.top += iOffset/2; 
		rcBm.bottom -= iOffset/2; 
		rcBm.right = rcBm.left + iCheckWid; 
		rcRect.left = rcBm.right + 2; 
 
		if(m_bSelected) 
		{ 
			SkinDraw::Draw(hDc,bmCheck,rcBm,iCheckWid,0,iCheckWid,iHei); 
		} 
		else 
		{ 
			SkinDraw::Draw(hDc,bmCheck,rcBm,0,0,iCheckWid,iHei); 
		} 
 
		if(uState & ODS_DISABLED) 
			SetTextColor(hDc,::GetSysColor(COLOR_GRAYTEXT));//灰色字:禁用状态 
		else 
			SetTextColor(hDc,::GetSysColor(COLOR_BTNTEXT));	//黑色字:普通状态	 
 
		SetBkMode(hDc,TRANSPARENT); 
		GetWindowText(lpdis->hwndItem,strText,MAX_PATH); 
		DrawText(hDc,strText,strlen(strText),&rcRect,DT_SINGLELINE|DT_CENTER|DT_VCENTER); 
				 
		if(GetFocus() == lpdis->hwndItem) 
		{ 
			rcRect.left += 3; 
			rcRect.right -= 3; 
			rcRect.top += 1; 
			rcRect.bottom -= 1; 
			DrawFocusRect(hDc,&rcRect); 
		} 
 
		return 1L; 
	} 
}; 
 
#endif