www.pudn.com > clking_src.rar > GuicheckBox.cpp
//-----------------------------------------------------------------------// // This is a part of the GuiLib MFC Extention. // // Autor : Francisco Campos // // (C) 2002 Francisco CamposAll 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 "GuiCheckBox.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CGuiCheckBox CGuiCheckBox::CGuiCheckBox() { m_bCheckBtn=FALSE; m_bPressBtn=FALSE; m_bOldTemp=FALSE; m_clrHigh=::GetSysColor(COLOR_HIGHLIGHT); m_clrCheck=RGB(0,170,170); m_bSelected=FALSE; } CGuiCheckBox::~CGuiCheckBox() { } BEGIN_MESSAGE_MAP(CGuiCheckBox, CButton) //{{AFX_MSG_MAP(CGuiCheckBox) ON_WM_ERASEBKGND() ON_WM_CREATE() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_TIMER() ON_WM_MOUSEMOVE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CGuiCheckBox message handlers void CGuiCheckBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC); CRect m_rcClient=lpDrawItemStruct->rcItem; UINT m_State=lpDrawItemStruct->itemState; CBrush cb; CRect m_rcTemp=m_rcClient; CPoint pt; CSize m_Csize; CString m_szCaption; COLORREF m_Over=RGB(255,193,111); CPen cpOver(PS_SOLID,1,RGB(255,193,111)); int iMode=pDC->SetBkMode(TRANSPARENT); int iExtile=GetButtonStyle(); //obtenemos orientación del texto CRect m_rcText=m_rcClient; GetWindowText(m_szCaption); if(m_szCaption.GetLength() > 1) m_Csize= pDC->GetTextExtent(m_szCaption); //de acuerdo a la alineación del texto prepare la ubicación //del texto para Drawtex y DrawState if (m_rcClient.Height() > 13) { int Dif=m_rcClient.Height()-13; Dif/=2; m_rcTemp.top=Dif; m_rcTemp.bottom=m_rcTemp.top+13; } if (iExtile & BS_LEFTTEXT) { m_rcTemp.left= m_rcTemp.right-13; pt=CPoint(m_rcTemp.left,m_rcTemp.top+1); } else { m_rcTemp.right= m_rcTemp.left+13; pt=CPoint(m_rcTemp.right+2,m_rcTemp.top+1); m_rcText.left=m_rcTemp.right+1; } //draw frame of checkbox pDC->Draw3dRect(m_rcTemp,m_clrHigh,m_clrHigh); m_rcTemp.DeflateRect(1,1); DrawOrange(pDC,m_rcTemp); m_rcTemp.DeflateRect(1,1); if (lpDrawItemStruct->itemState & ODS_DISABLED) pDC->DrawState(pt, m_Csize, m_szCaption, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL); else { pDC->DrawText(m_szCaption,m_rcText,DT_SINGLELINE|DT_LEFT|DT_VCENTER); if(lpDrawItemStruct->itemState & ODS_SELECTED) { if (m_bOldTemp == TRUE) DrawCheck(pDC,m_rcTemp); } else { if (m_bCheckBtn==TRUE && m_bPressBtn==FALSE) DrawCheck(pDC,m_rcTemp); else { if (m_bOldTemp == TRUE && m_bPressBtn==TRUE) DrawCheck(pDC,m_rcTemp); } } } } void CGuiCheckBox::DrawCheck(CDC* pDC,CRect m_rcTemp) { int iMediaAltura=(m_rcTemp.Height()/2)-2; int iMedioBox= m_rcTemp.Width()/2; CPen cp(PS_SOLID,1,m_clrCheck); CPen *pOld=pDC->SelectObject(&cp); pDC->MoveTo(m_rcTemp.left+1,m_rcTemp.top+iMediaAltura+3); pDC->LineTo(m_rcTemp.left+3,m_rcTemp.bottom-2); pDC->MoveTo(m_rcTemp.left+3,m_rcTemp.bottom-2); pDC->LineTo(m_rcTemp.right-1,m_rcTemp.top+2); pDC->MoveTo(m_rcTemp.left+1,m_rcTemp.top+iMediaAltura+2); pDC->LineTo(m_rcTemp.left+3,m_rcTemp.bottom-3); pDC->MoveTo(m_rcTemp.left+3,m_rcTemp.bottom-3); pDC->LineTo(m_rcTemp.right-1,m_rcTemp.top+1); pDC->MoveTo(m_rcTemp.left+1,m_rcTemp.top+iMediaAltura+1); pDC->LineTo(m_rcTemp.left+3,m_rcTemp.bottom-4); pDC->MoveTo(m_rcTemp.left+3,m_rcTemp.bottom-4); pDC->LineTo(m_rcTemp.right-1,m_rcTemp.top); pDC->SelectObject(pOld); } BOOL CGuiCheckBox::PreTranslateMessage(MSG* pMsg) { return CButton::PreTranslateMessage(pMsg); } void CGuiCheckBox::PreSubclassWindow() { ModifyStyle(0,BS_OWNERDRAW); CButton::PreSubclassWindow(); } BOOL CGuiCheckBox::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return FALSE; } int CGuiCheckBox::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CButton::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here return 0; } void CGuiCheckBox::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CButton::OnLButtonDown(nFlags, point); m_bPressBtn=TRUE; m_bOldTemp=m_bCheckBtn; Invalidate(); UpdateWindow(); KillTimer(1); SetTimer(1,10,NULL); } void CGuiCheckBox::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CButton::OnLButtonUp(nFlags, point); CRect m_rect; GetClientRect(&m_rect); if (m_rect.PtInRect(point)) { if (m_bCheckBtn==TRUE) m_bCheckBtn=FALSE; else m_bCheckBtn=TRUE; m_bOldTemp=m_bCheckBtn; m_bPressBtn=FALSE; m_bSelected =FALSE; KillTimer(1); SetTimer(1,100,NULL); Invalidate(); UpdateWindow(); } } void CGuiCheckBox::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CRect m_rect; GetClientRect(&m_rect); CPoint pt(GetMessagePos()); ScreenToClient(&pt); if (!m_rect.PtInRect(pt)) { m_bPressBtn=TRUE; m_bSelected =FALSE; Invalidate(); UpdateWindow(); KillTimer(1); } CButton::OnTimer(nIDEvent); } void CGuiCheckBox::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CRect m_rect; GetClientRect(&m_rect); if (m_bSelected == TRUE) return; if (m_rect.PtInRect(point)) { m_bSelected =TRUE; Invalidate(); UpdateWindow(); SetTimer(1,100,NULL); } CButton::OnMouseMove(nFlags, point); } void CGuiCheckBox::DrawOrange(CDC* pDC,CRect m_rcTemp) { if (m_bSelected== TRUE) { for(int i=0;i<2; i++) { COLORREF m_Over=RGB(255,193+(i+10),111+(i+10)); pDC->Draw3dRect(m_rcTemp,m_Over,m_Over); m_rcTemp.DeflateRect(1,1); } m_rcTemp.InflateRect(2,2); pDC->SetPixel(m_rcTemp.left+1,m_rcTemp.top+2,::GetSysColor(COLOR_3DHIGHLIGHT)); pDC->SetPixel(m_rcTemp.left+1,m_rcTemp.top+3,RGB(255,220,185)); pDC->SetPixel(m_rcTemp.left+1,m_rcTemp.top+4,RGB(255,220,185)); pDC->SetPixel(m_rcTemp.left+1,m_rcTemp.top+5,RGB(255,220,185)); pDC->SetPixel(m_rcTemp.left+1,m_rcTemp.top+6,RGB(255,220,185)); pDC->SetPixel(m_rcTemp.left+2,m_rcTemp.top,RGB(255,220,185)); pDC->SetPixel(m_rcTemp.left+3,m_rcTemp.top,RGB(255,220,185)); pDC->SetPixel(m_rcTemp.left+4,m_rcTemp.top,RGB(255,220,185)); pDC->SetPixel(m_rcTemp.left+5,m_rcTemp.top,RGB(255,220,185)); pDC->SetPixel(m_rcTemp.left,m_rcTemp.top,RGB(254,225,158)); pDC->SetPixel(m_rcTemp.left,m_rcTemp.top+1,RGB(255,255,255)); pDC->SetPixel(m_rcTemp.left,m_rcTemp.top+2,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left,m_rcTemp.top+3,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left,m_rcTemp.top+4,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left,m_rcTemp.top+5,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left,m_rcTemp.top+6,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left,m_rcTemp.top+7,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left,m_rcTemp.top+8,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left,m_rcTemp.top+9,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left,m_rcTemp.top,RGB(254,255,255)); pDC->SetPixel(m_rcTemp.left+1,m_rcTemp.top,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left+2,m_rcTemp.top,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left+3,m_rcTemp.top,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left+4,m_rcTemp.top,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left+5,m_rcTemp.top,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left+6,m_rcTemp.top,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left+7,m_rcTemp.top,RGB(255,243,217)); pDC->SetPixel(m_rcTemp.left,m_rcTemp.top+1,RGB(254,255,255)); pDC->SetPixel(m_rcTemp.left+1,m_rcTemp.top+1,RGB(254,220,139)); pDC->SetPixel(m_rcTemp.left+2,m_rcTemp.top+1,RGB(254,220,139)); pDC->SetPixel(m_rcTemp.left+3,m_rcTemp.top+1,RGB(254,220,139)); pDC->SetPixel(m_rcTemp.left+4,m_rcTemp.top+1,RGB(254,220,139)); pDC->SetPixel(m_rcTemp.left+5,m_rcTemp.top+1,RGB(254,220,139)); pDC->SetPixel(m_rcTemp.left+6,m_rcTemp.top+1,RGB(254,220,139)); pDC->SetPixel(m_rcTemp.left+7,m_rcTemp.top+1,RGB(254,220,139)); }else { CBrush cbSelec; cbSelec.CreateSysColorBrush(COLOR_3DHILIGHT); pDC->FillRect(m_rcTemp,&cbSelec); } }