// MyHyperLink.cpp : implementation file // // Written By : Renjith.R // Email : renji12renji@m2comsys.com // Details :Derived from MFC CStatic // Date :Nov 25 2002 #include "stdafx.h" #include "HyperLink.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMyHyperLink CMyHyperLink::CMyHyperLink() { m_sLinkColor = RGB(0, 0 ,255); m_sHoverColor = RGB(255, 0, 0); m_sVisitedColor = RGB(5, 34, 143); m_bFireChild = false; m_bMouseOver = false; m_bEnableToolTip = false; m_bVisited = false; //Create Tooltip } CMyHyperLink::~CMyHyperLink() { } BEGIN_MESSAGE_MAP(CMyHyperLink, CStatic) //{{AFX_MSG_MAP(CMyHyperLink) ON_WM_MOUSEMOVE() ON_WM_SETCURSOR() ON_CONTROL_REFLECT(BN_CLICKED, OnClicked) ON_WM_CTLCOLOR_REFLECT() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMyHyperLink message handlers //Sets the Link Color void CMyHyperLink::SetLinkColor(COLORREF sLinkColor) { m_sLinkColor = sLinkColor; } //open the URL by Windows ShellExecute() bool CMyHyperLink::GoToLinkUrl(CString csLink) { HINSTANCE hInstance = (HINSTANCE)ShellExecute(NULL, _T("open"), csLink.operator LPCTSTR(), NULL, NULL, 2); if ((UINT)hInstance < HINSTANCE_ERROR) { return false; } else return true; } //User can Active/Inactive the Tooltip already they set void CMyHyperLink::ActiveToolTip(int nFlag) { if (nFlag) m_bEnableToolTip = true; else m_bEnableToolTip = false; } //change The Tooltip text void CMyHyperLink::SetTootTipText(LPCSTR szToolTip) { if (m_bEnableToolTip ) { m_ToolTip.UpdateTipText(szToolTip,this,1001); } } //The Mouse Move Message void CMyHyperLink::OnMouseMove(UINT nFlags, CPoint point) { CStatic::OnMouseMove(nFlags, point); if (m_bMouseOver) { CRect oRect; GetClientRect(&oRect); //check if the mouse is in the rect if (oRect.PtInRect(point) == false) { m_bMouseOver = false; //Release the Mouse capture previously take ReleaseCapture(); RedrawWindow(); return; } } else { m_bMouseOver = true; RedrawWindow(); //capture the mouse SetCapture(); } } //before Subclassing void CMyHyperLink::PreSubclassWindow() { //Enable the Static to send the Window Messages To its parent DWORD dwStyle = GetStyle(); SetWindowLong(GetSafeHwnd() ,GWL_STYLE ,dwStyle | SS_NOTIFY); char szCurretText[MAX_PATH]; GetWindowText(szCurretText, MAX_PATH); if ((szCurretText) == NULL) { SetWindowText(m_csLinkText.operator LPCTSTR()); } LOGFONT sLogFont; GetFont()->GetLogFont(&sLogFont); //Set the Link UnderLined sLogFont.lfUnderline = true; //Set the Font to the Control m_oTextFont.CreateFontIndirect(&sLogFont); this->SetFont(&m_oTextFont, true); //Adjust the window //IsValidURL(); //Set the Cursor Hand //WinHlp32.exe in windows folder ResourceID 106 //is a standard window HAND cursor //courtesy www.codeguru.com //you can use a custom Hand cursor resourse also // i added that as a resourse in this project with // ID - IDC_CURSOR_HAND char szWindowsDir[MAX_PATH*2]; GetWindowsDirectory(szWindowsDir ,MAX_PATH*2); strcat(szWindowsDir,"\\Winhlp32.exe"); HMODULE hModule = LoadLibrary(szWindowsDir); if (hModule) { m_hHyperCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106)); } this->SetCursor(m_hHyperCursor); //free the module if (hModule) FreeLibrary(hModule); CStatic::PreSubclassWindow(); this->SetCursor(m_hHyperCursor); m_ToolTip.Create(this,TTS_ALWAYSTIP); CRect oRect; GetClientRect(&oRect); m_ToolTip.AddTool(this,"",oRect,1001); m_ToolTip.ShowWindow(SW_HIDE); } void CMyHyperLink::SetLinkText(CString csLinkText) { m_csLinkText = csLinkText; this->SetWindowText(csLinkText.operator LPCTSTR()); } BOOL CMyHyperLink::PreTranslateMessage(MSG* pMsg) { m_ToolTip.RelayEvent(pMsg); return CStatic::PreTranslateMessage(pMsg); } BOOL CMyHyperLink::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { ::SetCursor(m_hHyperCursor); return true; //return CStatic::OnSetCursor(pWnd, nHitTest, message); } //////////////////EVENT WILL GET HERE ////////////////////// void CMyHyperLink::OnClicked() { if (m_bFireChild) { //Fire the Event to Parent Window CWnd *pParent; pParent = GetParent(); int nCtrlID = GetDlgCtrlID(); ::SendMessage(pParent->m_hWnd, _HYPERLINK_EVENT, (WPARAM)nCtrlID, 0); //::PostMessage(pParent->m_hWnd, __EVENT_ID_, (WPARAM)nCtrlID, 0); } else { GoToLinkUrl(m_csUrl); } m_bVisited = true; //reddraw the control this->Invalidate(true); } HBRUSH CMyHyperLink::CtlColor(CDC* pDC, UINT nCtlColor) { if (m_bMouseOver) { if (m_bVisited) pDC->SetTextColor(m_sVisitedColor); else pDC->SetTextColor(m_sHoverColor); } else { if (m_bVisited) pDC->SetTextColor(m_sVisitedColor); else pDC->SetTextColor(m_sLinkColor); } pDC->SetBkMode(TRANSPARENT); return((HBRUSH)GetStockObject(NULL_BRUSH)); } void CMyHyperLink::SetToolTipTextColor(COLORREF sToolTipText) { m_ToolTip.SetTipTextColor(sToolTipText); } void CMyHyperLink::SetToolTipBgColor(COLORREF sToolTipBgColor) { m_ToolTip.SetTipBkColor(sToolTipBgColor); } CString CMyHyperLink::GetLinkText() { if (m_csLinkText.IsEmpty()) return CString(""); return m_csLinkText; } void CMyHyperLink::SetLinkUrl(CString csUrl) { m_csUrl= csUrl; } CString CMyHyperLink::GetLinkUrl() { return m_csUrl; } void CMyHyperLink::SetVisitedColor(COLORREF sVisitedColor) { m_sVisitedColor = sVisitedColor ; } void CMyHyperLink::SetHoverColor(COLORREF cHoverColor) { m_sHoverColor = cHoverColor; } void CMyHyperLink::SetFireChild(int nFlag) { if (nFlag) m_bFireChild = true; else m_bFireChild = false; } BOOL CMyHyperLink::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { NMHDR* pMsgHdr; pMsgHdr = (NMHDR*) lParam; switch (pMsgHdr->code) { case NM_RCLICK: break; default: ; } return CStatic::OnNotify(wParam, lParam, pResult); }