// RadioExt.cpp: implementation of the CRadioExt class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "RadioExt.h"
#include "library.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
WNDPROC	CRadioExt::m_cWndProc = NULL;
int	CRadioExt::pos = 0;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
 LRESULT CRadioExt::DefWindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
	{
		CPoint	point;
		LRESULT lReturn;
        TRACKMOUSEEVENT Tme;
		pos=FindPos((DWORD)hWnd, g_wndstatelist);
		pos++;
		switch( message )
		{
         case WM_ERASEBKGND:
			return 1;
		case WM_NCPAINT:
		case WM_PAINT:
			CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
			OnPaint( hWnd );
			return 1;
		case BM_SETSTYLE:	// ��ť���ı�
			CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_DEFAULT, wParam & BS_DEFPUSHBUTTON);
			OnPaint( hWnd );
			break;
		case BM_SETSTATE:	// ���ð�ť״̬
			lReturn = (LONG) CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
			CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_PRESSED, wParam);
			OnPaint( hWnd );
			return lReturn;
		case BM_SETCHECK:	// ����ѡ��״̬
			lReturn = (LONG) CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
			CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_CHECKED, (wParam == BST_CHECKED));
			CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_INDETERMINATE, (wParam == BST_INDETERMINATE));
			OnPaint( hWnd );
			return lReturn;
		case WM_SETTEXT:	// ���ô����ı�
			lReturn = (LONG) CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
			OnPaint( hWnd );
			return lReturn;
 	    case WM_MOUSELEAVE:		// ����Ƴ�
		     if (g_wndstatelist.ElementAt (pos) & CXPS_HOTLIGHT)
			 {
			      g_wndstatelist.ElementAt (pos) &= ~CXPS_HOTLIGHT;
			 }
		     if (g_wndstatelist.ElementAt (pos) & CXPS_PRESSED)
			 {
			      g_wndstatelist.ElementAt (pos) &= ~CXPS_PRESSED;
			 }
			OnPaint( hWnd );
            return 0;
	    case WM_MOUSEMOVE:		// �����ƶ�
		    if (((g_wndstatelist.ElementAt (pos) & CXPS_HOTLIGHT) == 0) && ((wParam & MK_LBUTTON) == 0))
			{
			g_wndstatelist.ElementAt (pos) |= CXPS_HOTLIGHT;
			OnPaint( hWnd );

			// ׷������Ƴ���Ϣһ��
		  	Tme.cbSize = sizeof(TRACKMOUSEEVENT);
			Tme.dwFlags = TME_LEAVE;
			Tme.hwndTrack = hWnd;
			_TrackMouseEvent(&Tme);
			}
		    break;
	     case WM_ENABLE:			// ���ڱ�����Ϊ���û����
		    CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_DISABLED, !wParam);
			OnPaint( hWnd );
	    	break;
		 case WM_DESTROY:
			 {
				 g_wndstatelist.RemoveAt(pos);
				 g_wndstatelist.RemoveAt(pos-1);
				 break;
			 }
		 default:
			break;
		}
		return CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
	}
	 
 	 
 void CRadioExt::OnPaint( HWND hWnd )
 {
	   RECT Rect,rc, rcText;
	   MEMDCXP Mdcxp;
	   HANDLE hHandle, hPen;
	   char szTemp[256];
	   DWORD dwStyle;
	   HDC hDC;
       // ��ȡ�ڴ�����豸����
	   Mdcxp.hWnd = hWnd;
	   Mdcxp.bTransfer = FALSE;
	   Mdcxp.hBitmap = NULL;
	   g_bDrawBk=1;
	   GetMemDCXP(&Mdcxp);
       hDC = Mdcxp.hMemDC;
       // ��ȡ���ڴ�С
	   GetWindowRect(hWnd, &Rect);
	   Rect.right -= Rect.left;
	   Rect.bottom -= Rect.top;
	   Rect.left = Rect.top = 0;
       // ��䱳��
	 //  hHandle = CreateSolidBrush(g_crDialogbkColor);
	 //  FillRect(hDC,&Rect, (HBRUSH)hHandle);
	//   DeleteObject(hHandle);
       //����ʾģʽ����λ��
	   dwStyle = GetWindowLong(hWnd, GWL_STYLE);
	   if (Rect.bottom > 13)
	   {
		   Rect.top = (Rect.bottom - 13)/2;
		   Rect.bottom = Rect.top + 13;
	   }
	   if (dwStyle & BS_LEFTTEXT)
	   {
		rcText = Rect;
		rcText.right -= 17;
	    Rect.left = Rect.right - 13;

	   }
	   else
	   {
		rcText = Rect;
		rcText.left += 17;
	    Rect.left = 0;
	    Rect.right = 13;
	   }
	   rc=Rect;
 	   // ���ȵ�򽥱䱳��(�ٻ�ɫ)
	   if (!(g_wndstatelist.ElementAt (pos) & CXPS_DISABLED))
	   {
		  if (g_wndstatelist.ElementAt (pos) & CXPS_PRESSED||g_wndstatelist.ElementAt (pos) & CXPS_HOTLIGHT)
		  {
			  CDC* pDC=CDC::FromHandle (hDC);

              rc.top -=2;
	          pDC->SetPixel(CPoint(7+rc.left ,rc.top+4),RGB(244,212,140));
	          pDC->SetPixel(CPoint(4+rc.left,rc.top+5),RGB(181,196,207));
	          pDC->SetPixel(CPoint(5+rc.left,rc.top+5),RGB(181,196,207));
	          pDC->SetPixel(CPoint(6+rc.left,rc.top+5),RGB(253,214,132));
	          pDC->SetPixel(CPoint(7+rc.left,rc.top+5),RGB(253,214,132));
	          pDC->SetPixel(CPoint(8+rc.left,rc.top+5),RGB(253,214,132));
              pDC->SetPixel(CPoint(9+rc.left,rc.top+5),RGB(253,214,132));
	          pDC->SetPixel(CPoint(4+rc.left,rc.top+6),RGB(252,220,152));
	          pDC->SetPixel(CPoint(5+rc.left,rc.top+6),RGB(252,220,152));
	          pDC->SetPixel(CPoint(6+rc.left,rc.top+6),RGB(247,227,179));
	          pDC->SetPixel(CPoint(7+rc.left,rc.top+6),RGB(242,237,215));
	          pDC->SetPixel(CPoint(8+rc.left,rc.top+6),RGB(247,227,179));
	          pDC->SetPixel(CPoint(9+rc.left,rc.top+6),RGB(251,200,99));
	          pDC->SetPixel(CPoint(10+rc.left,rc.top+6),RGB(251,200,99));

	          pDC->SetPixel(CPoint(3+rc.left,rc.top+7),RGB(254,223,156));
	          pDC->SetPixel(CPoint(4+rc.left,rc.top+7),RGB(254,220,152));
	          pDC->SetPixel(CPoint(5+rc.left,rc.top+7),RGB(233,236,210));
	          pDC->SetPixel(CPoint(9+rc.left,rc.top+7),RGB(233,236,210));
	          pDC->SetPixel(CPoint(10+rc.left,rc.top+7),RGB(251,200,99));
	          pDC->SetPixel(CPoint(11+rc.left,rc.top+7),RGB(251,200,99));
	
	
	          pDC->SetPixel(CPoint(3+rc.left,rc.top+8),RGB(253,217,140));
	          pDC->SetPixel(CPoint(4+rc.left,rc.top+8),RGB(247,227,179));
	          pDC->SetPixel(CPoint(10+rc.left,rc.top+8),RGB(247,227,179));
	          pDC->SetPixel(CPoint(11+rc.left,rc.top+8),RGB(251,200,99));
	

	          pDC->SetPixel(CPoint(2+rc.left,rc.top+9),RGB(254,223,156));
	          pDC->SetPixel(CPoint(3+rc.left,rc.top+9),RGB(254,220,152));
	          pDC->SetPixel(CPoint(4+rc.left,rc.top+9),RGB(233,236,210));
	          pDC->SetPixel(CPoint(10+rc.left,rc.top+9),RGB(233,236,210));
	          pDC->SetPixel(CPoint(11+rc.left,rc.top+9),RGB(251,200,99));
	          pDC->SetPixel(CPoint(12+rc.left,rc.top+9),RGB(251,200,99));

	          pDC->SetPixel(CPoint(3+rc.left,rc.top+10),RGB(252,211,124));
	          pDC->SetPixel(CPoint(4+rc.left,rc.top+10),RGB(246,224,172));
	          pDC->SetPixel(CPoint(10+rc.left,rc.top+10),RGB(251,200,99));
	          pDC->SetPixel(CPoint(11+rc.left,rc.top+10),RGB(251,200,99));
	
	          pDC->SetPixel(CPoint(3+rc.left,rc.top+11),RGB(254,223,156));
	          pDC->SetPixel(CPoint(4+rc.left,rc.top+11),RGB(254,220,152));
	          pDC->SetPixel(CPoint(5+rc.left,rc.top+11),RGB(233,236,210));
	          pDC->SetPixel(CPoint(9+rc.left,rc.top+11),RGB(233,236,210));
	          pDC->SetPixel(CPoint(10+rc.left,rc.top+11),RGB(251,200,99));
	          pDC->SetPixel(CPoint(11+rc.left,rc.top+11),RGB(251,200,99));

              pDC->SetPixel(CPoint(4+rc.left,rc.top+12),RGB(253,217,140));
	          pDC->SetPixel(CPoint(5+rc.left,rc.top+12),RGB(253,217,140));
	          pDC->SetPixel(CPoint(6+rc.left,rc.top+12),RGB(247,227,179));
	          pDC->SetPixel(CPoint(8+rc.left,rc.top+12),RGB(247,227,179));
	          pDC->SetPixel(CPoint(9+rc.left,rc.top+12),RGB(251,200,99));
	          pDC->SetPixel(CPoint(10+rc.left,rc.top+12),RGB(251,200,99));
	
	          pDC->SetPixel(CPoint(5+rc.left,rc.top+13),RGB(251,200,99));
	          pDC->SetPixel(CPoint(6+rc.left,rc.top+13),RGB(251,200,99));
	          pDC->SetPixel(CPoint(7+rc.left,rc.top+13),RGB(251,200,99));
	          pDC->SetPixel(CPoint(8+rc.left,rc.top+13),RGB(251,200,99));
	          pDC->SetPixel(CPoint(9+rc.left,rc.top+13),RGB(251,200,99));

	          pDC->SetPixel(CPoint(7+rc.left,rc.top+14),RGB(251,200,99));
		  }
	   }
       //�յı���ɫ
	   hHandle = SelectObject(hDC, GetStockObject(NULL_BRUSH));
       // ������ѡ�б�־(�м�СԲ��)
       if (g_wndstatelist.ElementAt (pos) & CXPS_CHECKED)
	   {
	       hPen= SelectObject(hDC, CreatePen(PS_SOLID, 1, RGB(29,147,29)));
	       hHandle = SelectObject(hDC, CreateSolidBrush(RGB(29,147,29)));
	       Ellipse(hDC, Rect.left+5, Rect.top+5,Rect.left+10,Rect.top+10);
	       DeleteObject(SelectObject(hDC,hPen));
	       DeleteObject(SelectObject(hDC,hHandle));
	   }

       //��Բ
	   hPen = SelectObject(hDC, CreatePen(PS_SOLID, 1, (g_wndstatelist.ElementAt (pos) & CXPS_DISABLED) ? (GetSysColor(COLOR_BTNFACE) - 0x00202020) : 0x00845118));
       Ellipse(hDC, Rect.left+2, Rect.top+2,Rect.left+13,Rect.top+13);
       DeleteObject(SelectObject(hDC,hPen));

       //�ָ�����ɫ
	   SelectObject(hDC, hHandle);
       // ������
	   if (GetWindowText(hWnd, szTemp, sizeof(szTemp)))
	   {	
		 //  SetBkColor(hDC, g_crDialogbkColor);
		SetTextColor(hDC, GetSysColor((g_wndstatelist.ElementAt (pos) & CXPS_DISABLED) ?  COLOR_GRAYTEXT: COLOR_BTNTEXT));
		hHandle = (HANDLE) SelectObject(hDC,
			(HGDIOBJ) SendMessage(hWnd, WM_GETFONT, 0, 0));
	    DrawText(hDC, szTemp, -1, &rcText, DT_SINGLELINE | DT_VCENTER);
		SelectObject(hDC, (HGDIOBJ) hHandle);
	   }
       //�ͷž��
	   Mdcxp.bTransfer = TRUE;
	   ReleaseMemDCXP(&Mdcxp);
 
	}