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






4.65/5 (45投票s)
封装超链接控件的类,用于网页重定向或普通按钮使用
引言
我知道已经有很多类实现了超链接功能,但没有一个让我满意,所以我决定自己写一个。它只是一个简单的按钮类,可以用于重定向网页或作为具有父通知的普通按钮。它继承自 CStatic
。可以指定四组图标(在链接处于普通、悬停、点击或禁用状态时),并将这些图标放在左侧、右侧或两侧。可以更改字体、大小和粗细,如上图所示。现在您还可以更改背景颜色,添加边框,使用多行文本,并选择自动生成禁用状态图标。要全面了解它的功能,请下载演示可执行文件。
Using the Code
该类非常易于使用。无论如何,我将解释该类的 public
方法及其语法。
首先也是最重要的两个方法是:SetLinkText
和 SetLinkUrl
,它们分别允许您设置链接文本和链接 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
不同。我添加了专门用于背景颜色的方法。SetBorderColor
、SetBorderSize
、SetBorderStyle
均用于更改边框行为。要禁用边框,只需调用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 加载图标。它们是
SetIconUp
、SetIconHover
、SetIconDown
、SetIconDisabled
。另外,我添加了一个方法来仅设置图标的显示方式(即uShowIcons
标志)。GetAutoGenerateDisabled
仅设置是否自动生成禁用状态图标。- 我认为
SetFont
不需要解释。该方法需要字体名称、字体大小、字体粗细和一个BOOL
值,指示字体是否为斜体,或者一个重载版本,它需要一个LPLOGFONT
。 Disable
仅禁用超链接。GetTooltip
和SetTooltip
分别获取或设置与控件一起使用的自定义工具提示。
注释
我在硬盘上找到了这些图标,但说实话不知道它们来自哪里,所以如果它们是受版权保护的材料,并且权利所有者不希望我使用它们,请告诉我,我会用其他东西替换它们。
结论
所以,我想这就是全部了。