www.pudn.com > clking_src.rar > GuiOutLook.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 "GuiOutLook.h" #include "resource.h" #include "GuiDrawlayer.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CGuiOutLook IMPLEMENT_DYNCREATE(CGuiOutLook, CWnd) CGuiOutLook::CGuiOutLook() { m_ArrayButtons.RemoveAll(); m_sizeImage=CSize(20,20); m_ActualButtonPres=-1; m_cbkg=::GetSysColor(COLOR_3DSHADOW); m_NumBottoms=0; m_mouseMove=-1; m_ultimoBotonResal=-1; m_Avance=0; //avance del scroll m_iDrawFrameUp=FALSE; //dibujar o no los botones arriba m_iDrawFrameDown=FALSE; //y abajo m_bIsXp=FALSE; } CItems::CItems(CGuiToolButton* button,HICON hIcon,CString szMessage,CString szToolTip) { m_bt=button; m_bt->SethIcon(hIcon); m_bt->SetToolTip(szToolTip); m_szMessage=szMessage; m_btipo=TRUE; } CGuiOutLook::~CGuiOutLook() { /* Modified By SunZhenyu 2003/8/22, Add next 7 lines. */ for(int i=0; i FillRect(rect,&cbm); return TRUE; } void CGuiOutLook::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default int m_iNumBotton= m_ArrayButtons.GetSize(); CClientDC dc(this); m_bPressU=FALSE; m_bPressD=FALSE; if (m_iDrawFrameUp==TRUE) { if (m_rectArrowUp.PtInRect(point)) { dc.DrawFrameControl(m_rectArrowUp,DFC_SCROLL,DFCS_SCROLLUP|DFCS_PUSHED); m_bPressU=TRUE; SetTimer(1,100,NULL); m_bPressU=FALSE; } } if (m_iDrawFrameDown==TRUE) { if (m_rectArrowDown.PtInRect(point)) { dc.DrawFrameControl(m_rectArrowDown,DFC_SCROLL,DFCS_SCROLLDOWN|DFCS_PUSHED); m_bPressD=TRUE; SetTimer(1,100,NULL); m_bPressD=FALSE; } } CWnd::OnLButtonDown(nFlags, point); } void CGuiOutLook::OnTimer(UINT nIDEvent) { if (nIDEvent == 1) { CPoint pt(GetMessagePos()); CRect m_rc; ScreenToClient(&pt); GetClientRect(m_rc); if (!m_rc.PtInRect(pt)) { KillTimer(1); CClientDC dc(this); if (m_bPressU==TRUE) dc.DrawFrameControl(m_rectArrowUp,DFC_SCROLL,DFCS_SCROLLUP); if (m_bPressD==TRUE) dc.DrawFrameControl(m_rectArrowDown,DFC_SCROLL,DFCS_SCROLLDOWN); } } CWnd::OnTimer(nIDEvent); } void CGuiOutLook::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); //------------------------------ if (m_iDrawFrameUp==TRUE) { if (m_rectArrowUp.PtInRect(point)) { m_Avance+=50; RecalLayout(); } else dc.DrawFrameControl(m_rectArrowUp,DFC_SCROLL,DFCS_SCROLLUP); } //----------------------------- if (m_iDrawFrameDown==TRUE) { if (m_rectArrowDown.PtInRect(point)) { m_Avance-=50; RecalLayout(); } else dc.DrawFrameControl(m_rectArrowDown,DFC_SCROLL,DFCS_SCROLLDOWN); } //------------------------------ CWnd::OnLButtonUp(nFlags, point); } void CGuiOutLook::RecalLayout() { static int m_iLastHeigh=0; //se almacena el ultimo valor de altura del area cliente CRect rect; CRect m_rectC; GetClientRect(&m_rectC); CClientDC dc(this); int iMitad; int iMinRequerido=0; iMitad= m_rectC.Width()/2; iMitad-=(m_sizeImage.cx/2); //posición a partir del cual se pintan los botones iMitad--; m_iDrawFrameUp=FALSE; //dibujar o no los botones arriba m_iDrawFrameDown=FALSE; //y abajo int m_iNumBotton= m_ArrayButtons.GetSize(); for( int iCont=1; iCont< m_iNumBotton;iCont++) { CItems* cit=(CItems*)m_ArrayButtons[iCont]; CSize sz=cit->m_bt->GetSizeButton(); iMinRequerido+=sz.cy+18; } int iy=5+m_Avance; //a partir de esta posición se comienza a escribir //calculo real del espacio que ocuparan los botones CRect rcMsg; for( iCont=1; iCont< m_iNumBotton;iCont++) { CItems* cit=(CItems*)m_ArrayButtons[iCont]; rect.left=iMitad; rect.top=iy; rect.bottom=rect.top+m_sizeImage.cy+6; rect.right=rect.left+m_sizeImage.cx+6; cit->m_bt->MoveWindow(rect); iy+=rect.Height()+18; } DeleteDC(dc); if (iy > m_rectC.Height()) m_iDrawFrameDown=TRUE; if (m_Avance < 0) m_iDrawFrameUp=TRUE; m_iLastHeigh=m_rectC.Height(); Invalidate(); UpdateWindow(); } void CGuiOutLook::OnSysColorChange() { CWnd::OnSysColorChange(); int m_iNumBotton= m_ArrayButtons.GetSize(); for( int iCont=1; iCont< m_iNumBotton;iCont++) { CItems* cit=(CItems*)m_ArrayButtons[iCont]; cit->m_bt->SetColor(GuiDrawLayer::GetRGBColorXP()); } Invalidate (); UpdateWindow (); } void CGuiOutLook::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); if (m_NumBottoms > 0) RecalLayout(); } BOOL CGuiOutLook::OnCommand(WPARAM wParam, LPARAM lParam) { HWND hwnd = (HWND) lParam; for (int i=1; i < m_NumBottoms+1;i++) { if (((CItems*) m_ArrayButtons [i])->m_bt->m_hWnd== hwnd) { int x=((CItems*) m_ArrayButtons [i])->m_bt->GetDlgCtrlID(); CWnd* pParent= GetParent(); pParent->SendMessage (WM_COMMAND,x); AfxGetMainWnd()->SendMessage(WM_COMMAND,x); return TRUE; } } return FALSE; } void CGuiOutLook::OnPaint() { CPaintDC dc(this); // device context for painting CRect rect; GetClientRect(&rect); CRect rcMsg; int iy=0; int m_iNumBotton= m_ArrayButtons.GetSize(); int iMitad= rect.Width()/2; iMitad-=(m_sizeImage.cx/2); //posición a partir del cual se pintan los botones iMitad--; int nMode=dc.SetBkMode(TRANSPARENT); CFont* cfont = dc.SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT))); for( int iCont=1; iCont< m_iNumBotton;iCont++) { CItems* cit=(CItems*)m_ArrayButtons[iCont]; CRect rcWin; cit->m_bt->GetWindowRect(rcWin); ScreenToClient(rcWin); rcMsg=rcWin; rcMsg.top=rcWin.bottom+2; rcMsg.bottom=rcMsg.top+16; rcMsg.left=rect.left; rcMsg.right=rect.right; dc.DrawText(cit->m_szMessage,rcMsg,DT_SINGLELINE|DT_CENTER|DT_VCENTER); } dc.SetBkMode(nMode); dc.SelectObject(cfont); if (m_iDrawFrameUp==TRUE) { m_rectArrowUp.top=5; m_rectArrowUp.bottom=m_rectArrowUp.top+16; m_rectArrowUp.right=rect.right-5; m_rectArrowUp.left=m_rectArrowUp.right-16; dc.DrawFrameControl(m_rectArrowUp,DFC_SCROLL,DFCS_SCROLLUP); } if (m_iDrawFrameDown==TRUE) { m_rectArrowDown.bottom=rect.bottom-5; m_rectArrowDown.top=m_rectArrowDown.bottom-16; m_rectArrowDown.right=rect.right-5; m_rectArrowDown.left=m_rectArrowDown.right-16; dc.DrawFrameControl(m_rectArrowDown,DFC_SCROLL,DFCS_SCROLLDOWN); } } void CGuiOutLook::SetImageList(UINT nBitmapID, int cx, int nGrow, COLORREF crMask) { CBitmap cbmp; BITMAP hbmp; cbmp.LoadBitmap(nBitmapID); cbmp.GetBitmap(&hbmp); m_imageList.Create(nBitmapID,cx,nGrow,crMask); m_imageList.Add(&cbmp,crMask); m_sizeImage=CSize(cx,hbmp.bmHeight); } void CGuiOutLook::AddItem(UINT Cmd,CString m_szCaption,int nIndex,CString m_ToolTip) { CGuiToolButton* m_guib=new CGuiToolButton(); m_NumBottoms++; m_guib->Create(_T(""), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW, CRect(0,0,0,0), this, Cmd); //m_guib->SetColor(GuiDrawLayer::GetRGBColorShadow()); //m_guib->ShowDark(FALSE); m_ArrayButtons.SetAtGrow(m_NumBottoms, new CItems (m_guib,m_imageList.ExtractIcon(nIndex),m_szCaption,m_ToolTip)); RecalLayout(); }