250 lines
5.4 KiB
C++
250 lines
5.4 KiB
C++
// ==========================================================================
|
|
// Class Implementation :
|
|
// COXStaticHyperLink
|
|
// ==========================================================================
|
|
|
|
// Implementation file : OXStaticHyperLink.cpp
|
|
|
|
// Version: 9.3
|
|
|
|
// COXStaticHyperLink implements a static control that's a hyperlink
|
|
// to any file on your desktop or web. You can use it in dialog boxes
|
|
// to create hyperlinks to web sites. When clicked, opens the file/URL
|
|
//
|
|
#include "StdAfx.h"
|
|
#include "OXStaticHyperLink.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNAMIC(COXStaticHyperLink, COXStatic)
|
|
|
|
BEGIN_MESSAGE_MAP(COXStaticHyperLink, COXStatic)
|
|
//{{AFX_MSG_MAP(COXStaticHyperLink)
|
|
ON_WM_CTLCOLOR_REFLECT()
|
|
ON_CONTROL_REFLECT(STN_CLICKED, OnClicked)
|
|
ON_WM_SETCURSOR()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
///////////////////
|
|
// Constructor sets default colors = blue/purple.
|
|
//
|
|
COXStaticHyperLink::COXStaticHyperLink():COXStatic()
|
|
{
|
|
// blue
|
|
m_clrUnvisited=RGB(0,0,255);
|
|
// purple
|
|
m_clrVisited=RGB(128,0,128);
|
|
// not Visited yet
|
|
m_bVisited=FALSE;
|
|
|
|
m_hCursor=NULL;
|
|
|
|
m_bUseWindowText=TRUE;
|
|
m_bErrorNotify=TRUE;
|
|
|
|
m_bShowToolTip=TRUE;
|
|
m_bToolTipUserDefined=FALSE;
|
|
|
|
m_bFitToText=TRUE;
|
|
|
|
m_hla.SetOwnerWnd(this);
|
|
|
|
}
|
|
|
|
// sets the COXHyperLinkAction object that will be executed if user clicks
|
|
void COXStaticHyperLink::SetAction(COXHyperLinkAction& hla)
|
|
{
|
|
m_hla=hla;
|
|
FormatToolTipText();
|
|
}
|
|
void COXStaticHyperLink::SetAction(int nActionID, LPCTSTR sFile, LPCTSTR sParameters,
|
|
LPCTSTR sDefaultDirectory, int nShowCmd,
|
|
UINT nCallbackMsgID, HWND hWndRecipient)
|
|
{
|
|
m_hla.Set(nActionID, sFile, sParameters, sDefaultDirectory, nShowCmd,
|
|
nCallbackMsgID, hWndRecipient);
|
|
FormatToolTipText();
|
|
}
|
|
|
|
// sets the color of COXStaticHyperLink object that wasn't visited
|
|
// (like unvisited link in HTML)
|
|
void COXStaticHyperLink::SetUnvisitedColor(COLORREF clr, BOOL bRedraw)
|
|
{
|
|
m_clrUnvisited=clr;
|
|
if(bRedraw)
|
|
{
|
|
Invalidate();
|
|
}
|
|
}
|
|
|
|
// sets the color of COXStaticHyperLink object that was visited
|
|
// (like visited link in HTML)
|
|
void COXStaticHyperLink::SetVisitedColor(COLORREF clr, BOOL bRedraw)
|
|
{
|
|
m_clrVisited=clr;
|
|
if(bRedraw)
|
|
{
|
|
Invalidate();
|
|
}
|
|
}
|
|
|
|
// sets the state of control as visited or unvisited
|
|
void COXStaticHyperLink::SetVisited(BOOL bVisited, BOOL bRedraw)
|
|
{
|
|
m_bVisited=bVisited;
|
|
if(bRedraw)
|
|
{
|
|
Invalidate();
|
|
}
|
|
}
|
|
|
|
// by default if COXHyperLinkAction::m_sFile is NULL we use text of
|
|
// control's window as COXHyperLinkAction::m_sFile. Use next function
|
|
// to set/unset this feature
|
|
void COXStaticHyperLink::SetUseWindowText(BOOL bUseWindowText)
|
|
{
|
|
m_bUseWindowText=bUseWindowText;
|
|
FormatToolTipText();
|
|
}
|
|
|
|
// returns TRUE if succeed and creates font used to draw text from plf,
|
|
// otherwise FALSE
|
|
BOOL COXStaticHyperLink::SetDefaultTextFont()
|
|
{
|
|
if(!IsStaticText(this))
|
|
return TRUE;
|
|
|
|
CFont* pFont=GetFont();
|
|
if(pFont==NULL)
|
|
return FALSE;
|
|
|
|
ASSERT_VALID(pFont);
|
|
|
|
if((HFONT)m_font!=NULL)
|
|
m_font.DeleteObject();
|
|
|
|
LOGFONT lf;
|
|
BOOL bResult=pFont->GetObject(sizeof(lf), &lf);
|
|
if(bResult)
|
|
{
|
|
// by default we make it underline
|
|
lf.lfUnderline=TRUE;
|
|
bResult=m_font.CreateFontIndirect(&lf);
|
|
|
|
if (bResult && m_bFitToText)
|
|
AdjustToFitText();
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
//////////////////
|
|
// Handle reflected WM_CTLCOLOR to set custom control color.
|
|
// For non-text controls, do nothing. Also ensures SS_NOTIFY is on.
|
|
//
|
|
HBRUSH COXStaticHyperLink::CtlColor(CDC* pDC, UINT nCtlColor)
|
|
{
|
|
HBRUSH hbr = COXStatic::CtlColor(pDC,nCtlColor);
|
|
pDC->SetTextColor(m_bVisited ? m_clrVisited : m_clrUnvisited);
|
|
return hbr;
|
|
}
|
|
|
|
/////////////////
|
|
// Handle mouse click: executes the associated action.
|
|
//
|
|
void COXStaticHyperLink::OnClicked()
|
|
{
|
|
BOOL bUsedWindowText=FALSE;
|
|
// if the file to open is NULL and m_bUseWindowText is TRUE then
|
|
// we use text of control as the file to open
|
|
if (m_hla.GetFile().IsEmpty() && m_bUseWindowText)
|
|
{
|
|
CString sWinText;
|
|
// ..get it from window text
|
|
GetWindowText(sWinText);
|
|
m_hla.SetFile(sWinText);
|
|
bUsedWindowText=TRUE;
|
|
}
|
|
|
|
// execute the action
|
|
if (m_hla.ExecuteIt(m_bErrorNotify))
|
|
{
|
|
// if action was successfully executed, set the control as visited
|
|
m_bVisited = TRUE;
|
|
Invalidate(); // repaint to show Visited color
|
|
}
|
|
|
|
if(bUsedWindowText)
|
|
{
|
|
m_hla.SetFile((LPCTSTR)NULL);
|
|
}
|
|
|
|
}
|
|
|
|
// change the cursor
|
|
BOOL COXStaticHyperLink::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
|
|
{
|
|
UNREFERENCED_PARAMETER(pWnd);
|
|
UNREFERENCED_PARAMETER(nHitTest);
|
|
UNREFERENCED_PARAMETER(message);
|
|
|
|
// if the cursor wasn't set by a programmer,
|
|
// initialize it
|
|
if(m_hCursor==NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
ASSERT(m_hCursor);
|
|
|
|
::SetCursor(m_hCursor);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// builds tooltip text
|
|
void COXStaticHyperLink::FormatToolTipText()
|
|
{
|
|
// set only if tooltip is shown
|
|
if(m_bShowToolTip)
|
|
{
|
|
// if tooltip text wasn't set then we set it to the value of
|
|
// COXHyperLinkAction::m_sFile or if it is empty to text
|
|
// of the control
|
|
if(!m_bToolTipUserDefined)
|
|
{
|
|
m_sToolTipText=m_hla.GetFile();
|
|
if(m_sToolTipText.IsEmpty() && m_bUseWindowText)
|
|
{
|
|
if(IsStaticText(this))
|
|
{
|
|
GetWindowText(m_sToolTipText);
|
|
}
|
|
else
|
|
{
|
|
m_sToolTipText.Empty();
|
|
}
|
|
}
|
|
}
|
|
|
|
m_ttc.UpdateTipText(m_sToolTipText, this, ID_HLTOOLTIP);
|
|
}
|
|
}
|
|
|
|
BOOL COXStaticHyperLink::InitStatic()
|
|
{
|
|
// set default cursor
|
|
SetDefaultLinkCursor();
|
|
|
|
return COXStatic::InitStatic();
|
|
}
|
|
|
|
|