www.pudn.com > clking_src.rar > GuiLinkButton.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 "GuiLinkButton.h" #include "Resource.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CGuiLinkButton CGuiLinkButton::CGuiLinkButton() { m_clNormal=RGB(0,0,200); m_clover=RGB(0,0,255); m_Link=""; m_cfont.CreateFont(14,0,0,0,400,0,1,0,0,1,2,1,34,"Arial"); m_iSelected=0; m_rectMsg.SetRectEmpty( ); m_bFirstPas=TRUE; } CGuiLinkButton::~CGuiLinkButton() { } BEGIN_MESSAGE_MAP(CGuiLinkButton, CButton) //{{AFX_MSG_MAP(CGuiLinkButton) ON_WM_ERASEBKGND() ON_WM_MOUSEMOVE() ON_WM_TIMER() ON_WM_LBUTTONDOWN() ON_WM_CREATE() ON_WM_SETCURSOR() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CGuiLinkButton message handlers void CGuiLinkButton::SetColorNormal(COLORREF m_clnor) { m_clNormal=m_clnor; } void CGuiLinkButton::SetColorSelect(COLORREF m_clselec) { m_clover=m_clselec; } void CGuiLinkButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your code to draw the specified item CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC); CRect m_rect=lpDrawItemStruct->rcItem; CSize SizeCad=CSize(0,0); int m_iStatus=lpDrawItemStruct->itemState; int m_iMode; int m_iposx; int m_iposy; CBrush cb; cb.CreateSysColorBrush(COLOR_BTNFACE); static CPoint pt=CPoint(2,1); CString m_sCaption; GetWindowText(m_sCaption); //se calcula la posición exacta del texto para que solo se //seleccione cuando se encuentre el puntero en el rectangulo SizeCad=pDC->GetTextExtent(m_sCaption); if (m_bFirstPas==TRUE) { if (SizeCad.cx < m_rect.Width()) { pDC->FillRect(m_rect,&cb); m_iposx=m_rect.Width()-(SizeCad.cx+30); m_iposy=m_rect.Height()-SizeCad.cy; m_rectMsg=m_rect; m_rectMsg.bottom=m_rect.bottom-(m_iposy-2); m_rectMsg.right=m_rect.right-(m_iposx); SetWindowPos (NULL, m_rectMsg.left, m_rectMsg.top,m_rectMsg.right, m_rectMsg.bottom, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); m_bFirstPas=FALSE; } } m_iMode=pDC->SetBkMode(TRANSPARENT); CFont* m_OldFont=pDC->SelectObject(&m_cfont); if (m_iSelected==1) pDC->SetTextColor(m_clover); else pDC->SetTextColor(m_clNormal); pDC->DrawState(pt, SizeCad, m_sCaption, (m_iStatus==ODS_DISABLED)?DSS_DISABLED:DSS_NORMAL, TRUE, 0, (CBrush*)NULL); pDC->SelectObject(m_OldFont); pDC->SetBkMode(m_iMode); } void CGuiLinkButton::PreSubclassWindow() { // TODO: Add your specialized code here and/or call the base class ModifyStyle(0,BS_OWNERDRAW); CButton::PreSubclassWindow(); } BOOL CGuiLinkButton::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if (GetSafeHwnd() == NULL) return FALSE; if (pMsg->message== WM_MOUSEMOVE) if (m_ToolTipCtrl.GetSafeHwnd()) m_ToolTipCtrl.RelayEvent(pMsg); return CButton::PreTranslateMessage(pMsg); } BOOL CGuiLinkButton::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return TRUE; } void CGuiLinkButton::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default ::SetCursor(::LoadCursor(NULL,MAKEINTRESOURCE(32649)));//IDC_HAND)); CRect m_rect; GetClientRect(&m_rect); if (m_iSelected == 1) return; if (m_rect.PtInRect(point)) { m_iSelected =1; Invalidate(); UpdateWindow(); SetTimer(1,100,NULL); } CButton::OnMouseMove(nFlags, point); } void CGuiLinkButton::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if(nIDEvent== 1) { CPoint pt=GetMessagePos(); ScreenToClient(&pt); if (!m_rectMsg.PtInRect(pt)) { m_iSelected=0; Invalidate(); UpdateWindow(); KillTimer(1); } } CButton::OnTimer(nIDEvent); } void CGuiLinkButton::SetToolTip(LPCSTR m_lpMsg) { if (GetSafeHwnd()== NULL) return; if (m_lpMsg != NULL) { if (m_ToolTipCtrl.GetSafeHwnd () == NULL) { m_ToolTipCtrl.Create(this,TTS_ALWAYSTIP); m_ToolTipCtrl.Activate(TRUE); m_ToolTipCtrl.AddTool(this,m_lpMsg); } else { m_ToolTipCtrl.UpdateTipText(m_lpMsg,this); } } else { if (m_ToolTipCtrl.GetSafeHwnd () == NULL) { m_ToolTipCtrl.Create(this,TTS_ALWAYSTIP); m_ToolTipCtrl.AddTool(this,m_lpMsg); } else m_ToolTipCtrl.UpdateTipText(m_lpMsg,this); m_ToolTipCtrl.Activate(FALSE); } } void CGuiLinkButton::SetLink(LPCSTR lpMsg) { m_Link=lpMsg; } void CGuiLinkButton::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default ShellExecute (NULL, "open",m_Link, NULL, NULL, 0) ; CButton::OnLButtonDown(nFlags, point); } int CGuiLinkButton::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CButton::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here return 0; } BOOL CGuiLinkButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { SetCursor(::LoadCursor(NULL,MAKEINTRESOURCE(32649))); return CButton::OnSetCursor(pWnd, nHitTest, message); }