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