2025-11-27 16:46:48 +09:00

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();
}