【VC开源代码栏目提醒】:网学会员为需要VC开源代码的朋友们搜集整理了HLINKCTL.CPP相关资料,希望对各位网友有所帮助!
/*
Module : HLINKCTRL.CPP
Purpose: Implementation for a MFC class for a static text control class with hyperlink support
Created: PJN / HLINK/1 / 16-06-1997
History: PJN / / 24-06-1997, hyperlinks are now coloured ala IE
PJN / / 15-07-1997, Now supports ShrinkToFit
PJN / 11-09-1997, Added support for a highlight look
which includes a highlight color and
a shadowed look. Also fixed a bug
relating to the Edit controls context
menu.
Also included is a new context menu ala IE3
PJN / 06-11-1997, 1) Improved drawing of control by handling WM_CTLCOLOR through MFC message reflection
2) class now derived from CStatic as it should have been from the begining
3) Dropped support for shrink to fit as now no need
4) Description is now taken from controls window text
5) Now using more standard visited and unvisted colors
6) Dropped support for optional underlying and drop shadow effects
7) streamlined some of the functions declarations
8) Wait cursor is now shown when a shortcut is being saved
9) Context menu for control can now be turned off if so desired
PJN / 08-12-1997, 1) Removed ON_COMMAND(ID_POPUP_OPEN, OnOpen) from #define which was causing
to the hyperlink correctly
2) Removed a level 4 warning which was being generated when building in release mode
PJN / 09-01-1998 1) Removed duplicate OnAddToFavorites and OnAddToDesktop functions
Copyright (c) 1997 by PJ Naughter.
All rights reserved.
*/
///////////////////////////////// Includes //////////////////////////////////
#include "stdafx.h"
#ifndef HLINK_NOOLE
#define INITGUID
#endif
#include "resource.h"
#include "hlinkctl.h"
#ifndef HLINK_NOOLE
#include <initguid.h>
#endif
#include <winnetwk.h>
#include <winnls.h>
#include <shlobj.h>
#ifndef HLINK_NOOLE
#include <intshcut.h>
#endif
///////////////////////////////// Macros & Statics ///////////////////////////
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////// Implementation //////////////////////////////
BEGIN_MESSAGE_MAP(CHLinkCtrl, CStatic)
ON_WM_CONTEXTMENU()
//{{AFX_MSG_MAP(CHLinkCtrl)
ON_WM_SETCURSOR()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_COMMAND(ID_POPUP_COPYSHORTCUT, OnCopyShortcut)
ON_COMMAND(ID_POPUP_PROPERTIES, OnProperties)
//}}AFX_MSG_MAP
ON_WM_CTLCOLOR_REFLECT()
ON_COMMAND(ID_POPUP_OPEN, OnOpen)
#ifndef HLINK_NOOLE
ON_COMMAND(ID_POPUP_ADDTOFAVORITES, OnAddToFavorites)
ON_COMMAND(ID_POPUP_ADDTODESKTOP, OnAddToDesktop)
#endif
END_MESSAGE_MAP()
CHLinkCtrl::CHLinkCtrl()
{
m_Color = RGB(0, 0, 255);
m_VisitedColor = RGB(128, 0, 128);
m_HighlightColor = RGB(255, 0, 0);
m_bShrinkToFit = TRUE;
m_bUseHighlight = TRUE;
m_State = ST_NOT_VISITED;
m_OldState = ST_NOT_VISITED;
m_bShowingContext = FALSE;
m_bAllowContextMenu = TRUE;
//Load up the cursors
m_hLinkCursor = AfxGetApp()->LoadCursor(IDC_HLINK);
m_hArrowCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
}
CHLinkCtrl::~CHLinkCtrl()
{
}
void CHLinkCtrl::SetHyperLink(const CString& sActualLink)
{
SetActualHyperLink(sActualLink);
}
void CHLinkCtrl::SetHyperLinkDescription(const CString& sDescription)
{
SetWindowText(sDescription);
}
CString CHLinkCtrl::GetHyperLinkDescription() const
{
CString sDescription;
GetWindowText(sDescription);
return sDescription;
}
void CHLinkCtrl::SetActualHyperLink(const CString& sActualLink)
{
m_sActualLink = sActualLink;
}
BOOL CHLinkCtrl::OnSetCursor(CWnd* /*pWnd*/, UINT /*nHitTest*/, UINT /*message*/)
{
if (m_bShowingContext)
::SetCursor(m_hArrowCursor);
else
::SetCursor(m_hLinkCursor);
return TRUE;
}
void CHLinkCtrl::OnLButtonDown(UINT /*nFlags*/, CPoint /*point*/)
{
PostMessage(WM_COMMAND, ID_POPUP_OPEN);
}
void CHLinkCtrl::OnOpen()
{
if (Open())
m_State = ST_VISITED;
}
void CHLinkCtrl::SetLinkColor(const COLORREF& color)
{
m_Color = color;
UpdateWindow();
}
void CHLinkCtrl::SetVisitedLinkColor(const COLORREF& color)
{
m_VisitedColor = color;
UpdateWindow();
}
void CHLinkCtrl::SetHighlightLinkColor(const COLORREF& color)
{
m_HighlightColor = color;
UpdateWindow();
}
void CHLinkCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bUseHighlight)
return;
CRect rc;
GetClientRect(rc);
if (rc.PtInRect(point))
{
if (m_State != ST_HIGHLIGHTED)
{
SetCapture();
HighLight(TRUE);
}
}
else
{
if (m_State == ST_HIGHLIGHTED)
{
HighLight(FALSE);
ReleaseCapture();
}
}
CStatic::OnMouseMove(nFlags, point);
}
void CHLinkCtrl::HighLight(BOOL state)
{
if (state)
{
if (m_State != ST_HIGHLIGHTED)
{
m_OldState = m_State;
m_State = ST_HIGHLIGHTED;
Invalidate();
}
}
else
{
if (m_State == ST_HIGHLIGHTED)
{
m_State = m_OldState;
Invalidate();
}
}
}
void CHLinkCtrl::OnContextMenu(CWnd*, CPoint point)
{
if (!m_bAllowContextMenu)
return;
HighLight(FALSE);
ReleaseCapture();
if (point.x == -1 && point.y == -1)
{
//keystroke invocation
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5, 5);
}
CMenu menu;
VERIFY(menu.LoadMenu(IDR_HLINK_POPUP));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
m_bShowingContext = TRUE;
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
m_bShowingContext = FALSE;
}
void CHLinkCtrl::OnCopyShortcut()
{
if (OpenClipboard())
{
int nBytes = sizeof(TCHAR) * (m_sActualLink.GetLength() + 1);
HANDLE hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, nBytes);
TCHAR* pData = (TCHAR*) GlobalLock(hMem);
_tcscpy(pData, (LPCTSTR) m_sActualLink);
GlobalUnlock(hMem);
SetClipboardData(CF_TEXT, hMem);
CloseClipboard();
}
}
void CHLinkCtrl::OnProperties()
{
ShowProperties();
}
void CHLinkCtrl::ShowProperties() const
{
CHLinkSheet propSheet(IDS_HLINK_PROPERTIES, this->GetParent());
propSheet.m_psh.dwFlags |= PSH_NOAPPLYNOW;
propSheet.SetBuddy(this);
propSheet.DoModal();
}
BOOL CHLinkCtrl::Open() const
{
CWaitCursor cursor;
#ifndef HLINK_NOOLE
//First try to open using IUniformResourceLocator
BOOL bSuccess = OpenUsingCom();
//As a last resort try ShellExecuting the URL, may
//even work on Navigator!
if (!bSuccess)
bSuccess = OpenUsingShellExecute();
#else
BOOL bSuccess = OpenUsingShellExecute();
#endif
return bSuccess;
}
#ifndef HLINK_NOOLE
BOOL CHLinkCtrl::OpenUsingCom() const
{
//Get the URL Com interface
IUniformResourceLocator* pURL;
HRESULT hres = CoCreateInstance(CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER, IID_IUniformResourceLocator, (void**) &pURL);
if
上一篇:
HISTOGRAMTESTDLG.CPP
下一篇:
餐饮管理系统