65.9K
CodeProject 正在变化。 阅读更多。
Home

CHyperLink:一个简单的 MFC 超链接按钮类,支持任意尺寸的 32bpp 图标

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.65/5 (45投票s)

2005年11月2日

CPOL

5分钟阅读

viewsIcon

213506

downloadIcon

5401

封装超链接控件的类,用于网页重定向或普通按钮使用

HyperLink Demo

引言

我知道已经有很多类实现了超链接功能,但没有一个让我满意,所以我决定自己写一个。它只是一个简单的按钮类,可以用于重定向网页或作为具有父通知的普通按钮。它继承自 CStatic。可以指定四组图标(在链接处于普通、悬停、点击或禁用状态时),并将这些图标放在左侧、右侧或两侧。可以更改字体、大小和粗细,如上图所示。现在您还可以更改背景颜色,添加边框,使用多行文本,并选择自动生成禁用状态图标。要全面了解它的功能,请下载演示可执行文件。

Using the Code

该类非常易于使用。无论如何,我将解释该类的 public 方法及其语法。

首先也是最重要的两个方法是:SetLinkTextSetLinkUrl,它们分别允许您设置链接文本和链接 URL(后者也将用作工具提示文本)。您也可以使用 "mailto:me@mail.com" 这种语法设置电子邮件地址链接,正如您所知。

TCHAR* GetLinkText();
void SetLinkText(TCHAR* lpText);

TCHAR* GetLinkUrl();
void SetLinkUrl(TCHAR* lpUrl);

我认为这些不需要解释。

现在是一些用于指定超链接可选行为的方法。

void LockInPosition(BOOL bLockInPosition = FALSE);

BOOL IsMultiline() { return m_bMultiline; }
void SetMultiline(BOOL bMultiline);

void IsLink(BOOL bIsLink = TRUE);

void UnderlineAlways(BOOL bUnderlineAlways = FALSE);

COLORREF GetUpColor() { return m_crLinkUp; }
COLORREF GetHoverColor() { return m_crLinkHover; }
COLORREF GetDownColor() { return m_crLinkDown; }
COLORREF GetBackgroundColor() { return m_crBackGround; }
void SetColors(COLORREF crLinkUp, COLORREF crLinkHover, COLORREF crLinkDown, 
    COLORREF crBackGround = ::GetSysColor(COLOR_BTNFACE));
void SetBackgroundColor(COLORREF crBackGround = ::GetSysColor(COLOR_BTNFACE));

COLORREF GetBorderColor() { return m_crBorder; }
void SetBorderColor(COLORREF crBorder = RGB(0,0,0));
int GetBorderSize() { return m_nBorderSize; }
void SetBorderSize(int nSize);
int GetBorderStyle() { return m_nBorderStyle; }
void SetBorderStyle(int nStyle);

UINT GetShowIconsOpt() { return m_uShowIcon; }
void SetIcons(HICON hIconUp, HICON hIconHover, HICON hIconDown, 
    UINT uShowIcons, HICON hIconDisabled = NULL);
void SetIconUp(int nIconUp, int dx = 0, int dy = 0);
void SetIconHover(int nIconHover, int dx = 0, int dy = 0);
void SetIconDown(int nIconDown, int dx = 0, int dy = 0);
void SetIconDisabled(int nIconDisabled, int dx = 0, int dy = 0);
void SetShowIcons(UINT uShowIcons);

BOOL GetAutoGenerateDisabled() { return m_bAutoGenerateDisabled; }
void SetAutoGenerateDisabled(BOOL bAutoGenerate);

BOOL SetFont(TCHAR* lpFaceName = "Arial", int nSize = 14, 
    int nWeight = FW_NORMAL, BOOL bItalic = FALSE);
BOOL SetFont(const LPLOGFONT lpFont);

void Disable(BOOL bDisable = FALSE);

CToolTipCtrl* GetTooltip();
void SetTooltip(CToolTipCtrl* pToolTip);
  • 调用 LockInPosition 来指定链接在绘制时是否要为图标留出空间,即使图标不可见。尝试演示应用程序来理解它是如何工作的。
  • UnderlineAlways 指定超链接是否始终保持下划线样式,即使链接未悬停。
  • IsLink 返回超链接是否为指向网页的链接,并且 URL 字符串是否为网页 URL,或者它只是一个工具提示文本,而该按钮是一个常规的对话框按钮。关于此方法的要点是:如果您调用 IsLink(FALSE),因此该链接被视为常规按钮,则该类会自动将点击事件通知给父窗口;反之,如果超链接用作链接,则只有当控件设置了静态样式 SS_NOTIFY 时,才会发送通知。
  • SetColors 设置超链接的颜色。参数易于理解。最后一个参数指定背景颜色。我添加了它来解决透明背景模拟的问题,如果您使用的对话框背景颜色与默认的 COLOR_BTNFACE 不同。我添加了专门用于背景颜色的方法。
  • SetBorderColorSetBorderSizeSetBorderStyle 均用于更改边框行为。要禁用边框,只需调用 SetBorderSize(0)
  • GetShowIconsOpt 仅检索指定如何显示图标的 UINT 标志。如果您需要为其他已存在的可视化添加一个,而不是一次性设置所有内容,则此方法很有用(例如:SetIcons(NULL,NULL,NULL,m_HyperLink.GetGetShowIconsOpt() | 0x0005))。
  • SetIcons 设置要在链接的左侧、右侧或两侧显示的超链接图标,用于所有不同的状态:普通、悬停、点击、禁用。图标可以是任何尺寸和/或格式。首先,如果您已经设置了一个图标,可以将 NULL 传递给该图标以保持不变。现在对最后一个参数 uShowIcons 进行一些解释。这是一个 WORD 标志。下面的声明有助于理解它接受哪些值:
    enum {
        SI_ICONUP_ON    = 0x0001, //Show icon when mouse Up (normal)
        SI_ICONUP_LEFT  = 0x0002, //Show icon when mouse up on the left
        SI_ICONUP_RIGHT = 0x0004, //Show icon when mouse up on the right
        //
        SI_ICONHOVER_ON    = 0x0010, //Show icon when mouse hover
        SI_ICONHOVER_LEFT  = 0x0020, //Show icon when mouse hover on the left
        SI_ICONHOVER_RIGHT = 0x0040, //Show icon when mouse hover on the right
        //
        SI_ICONDOWN_ON    = 0x0100, //Show icon when mouse down
        SI_ICONDOWN_LEFT  = 0x0200, //Show icon when mouse down on the left
        SI_ICONDOWN_RIGHT = 0x0400 //Show icon when mouse down on the right
        //
        SI_ICONDISABLED_ON    = 0x1000, //Show icon when hyperlink is disabled
        SI_ICONDISABLED_LEFT  = 0x2000, //Show icon when hyperlink is 
                                        //disabled on the left
        SI_ICONDISABLED_RIGHT = 0x4000  //Show icon when hyperlink is 
                                        //disabled on the right
    }; 

    位 0-7 代表普通超链接状态下显示的图标,位 8-15 代表悬停超链接状态下显示的图标,16-23 代表点击超链接状态下显示的图标,最后 8 位代表禁用状态。每个 8 位标志表示图标如何显示,以及它是否在此状态下显示在左侧/右侧。因此,值为 3 只显示左侧图标,值为 5 只显示右侧图标,值为 7 同时显示在左侧和右侧。因此,如果您想在所有状态下都显示图标,并且同时显示在左侧和右侧,只需调用 SetIcons 并将 0x7777 作为最后一个参数。这比解释起来更简单。例如,如果您想要一个在左侧有一个图标的超链接,当鼠标悬停在超链接上时,该图标会从左侧消失并在右侧出现,并且当您单击超链接或禁用时,您希望显示两个图标,那么您只需调用 SetIcons 并将标志设置为 0x7753。类似这样:

    SetIcons(theApp.LoadIcon(IDI_ICON1), 
         theApp.LoadIcon(IDI_ICON1),theApp.LoadIcon(IDI_ICON1),0x0753);

    此外,我还添加了一些特定的函数来从资源 ID 加载图标。它们是 SetIconUpSetIconHoverSetIconDownSetIconDisabled。另外,我添加了一个方法来仅设置图标的显示方式(即 uShowIcons 标志)。

  • GetAutoGenerateDisabled 仅设置是否自动生成禁用状态图标。
  • 我认为 SetFont 不需要解释。该方法需要字体名称、字体大小、字体粗细和一个 BOOL 值,指示字体是否为斜体,或者一个重载版本,它需要一个 LPLOGFONT
  • Disable 仅禁用超链接。
  • GetTooltipSetTooltip 分别获取或设置与控件一起使用的自定义工具提示。

注释

我在硬盘上找到了这些图标,但说实话不知道它们来自哪里,所以如果它们是受版权保护的材料,并且权利所有者不希望我使用它们,请告诉我,我会用其他东西替换它们。

结论

所以,我想这就是全部了。

© . All rights reserved.