1:控件宿主
在现有的控件上进行二次开发是一个不错的选择,这样做可以避免需要自己设计一个ACTX控件的麻烦。
在现有的控件中,静态文本STATIC无疑是最好的选择。所以我们的类,将选择继承自CStatic。并且为了能够接受WM_MOUSEMOVE消息,我们需要添加相应的消息映射接口~
2:一些基础功能
作为超链接控件,我们至少需要能够改变控件的背景颜色和文本颜色。而且控件应该有鼠标指针切换的功能(即鼠标移到控件上,指针变为小手,移除后恢复)
如果你喜欢,可以增加下划线效果(个人不喜欢超链接带下划线TvT)
至于单击事件,是继承自CStatic
3:如何实现
嗯,终于到重点了。
关于如何实现,一两句废话是讲不清楚的,也难以讲清楚,所以我们有必要结合代码来说明。
首先我们要解决类声明的问题(class declaration)
下面CLabelLink的类声明
view source
#pragma once
class CLabelLink : public CStatic
{
public:
CLabelLink();
virtual ~CLabelLink(); // 保证正确析构
// interface declaration
void SetTextColor(COLORREF clrText); // 设置文本颜色
void SetBackgroundColor(COLORREF clrBackground); //设置背景颜色
void EnableTrack(BOOL bEnable = TRUE); // 是否鼠标跟踪.即鼠标移入控件时指针切换的功能
void SetLinkUrl(LPCTSTR lpszTargetUrl); // 设置目标链接地址
protected:
virtual void PreSubclassWindow(); // 用以设置控件属性
afx_msg HBRUSH CtlColor(CDC *pDC, UINT nCtlColor); // 控件颜色设置消息映射
afx_msg void OnMouseMove(UINT nFlags, CPoint point); // 鼠标移动消息映射
afx_msg void OnStnClicked(); // 控件单击消息映射
DECLARE_MESSAGE_MAP()
protected:
BOOL m_bHover;
BOOL m_bTrack;
COLORREF m_clrTextColor;
COLORREF m_clrBackgroundColor;
CBrush m_Brush;
CString m_sTargetUrl;
};
大致了解下上面的代码,我们就会发现,CLabelLink提供给Coder的接口主要就那么四个:SetTextColor、SetBackgroundColor、EnableTrack和SetLinkUrl。对于这四个接口,理解起来都是没有问题的。
首先我们需要关注的是如何设置控件的文本颜色和背景颜色。在MFC中,这通常是利用DialogBox的WM_CTLCOLOR消息中进行控件绘制。
在现有的控件上进行二次开发是一个不错的选择,这样做可以避免需要自己设计一个ACTX控件的麻烦。
在现有的控件中,静态文本STATIC无疑是最好的选择。所以我们的类,将选择继承自CStatic。并且为了能够接受WM_MOUSEMOVE消息,我们需要添加相应的消息映射接口~
2:一些基础功能
作为超链接控件,我们至少需要能够改变控件的背景颜色和文本颜色。而且控件应该有鼠标指针切换的功能(即鼠标移到控件上,指针变为小手,移除后恢复)
如果你喜欢,可以增加下划线效果(个人不喜欢超链接带下划线TvT)
至于单击事件,是继承自CStatic
3:如何实现
嗯,终于到重点了。
关于如何实现,一两句废话是讲不清楚的,也难以讲清楚,所以我们有必要结合代码来说明。
首先我们要解决类声明的问题(class declaration)
下面CLabelLink的类声明
view source
#pragma once
class CLabelLink : public CStatic
{
public:
CLabelLink();
virtual ~CLabelLink(); // 保证正确析构
// interface declaration
void SetTextColor(COLORREF clrText); // 设置文本颜色
void SetBackgroundColor(COLORREF clrBackground); //设置背景颜色
void EnableTrack(BOOL bEnable = TRUE); // 是否鼠标跟踪.即鼠标移入控件时指针切换的功能
void SetLinkUrl(LPCTSTR lpszTargetUrl); // 设置目标链接地址
protected:
virtual void PreSubclassWindow(); // 用以设置控件属性
afx_msg HBRUSH CtlColor(CDC *pDC, UINT nCtlColor); // 控件颜色设置消息映射
afx_msg void OnMouseMove(UINT nFlags, CPoint point); // 鼠标移动消息映射
afx_msg void OnStnClicked(); // 控件单击消息映射
DECLARE_MESSAGE_MAP()
protected:
BOOL m_bHover;
BOOL m_bTrack;
COLORREF m_clrTextColor;
COLORREF m_clrBackgroundColor;
CBrush m_Brush;
CString m_sTargetUrl;
};
大致了解下上面的代码,我们就会发现,CLabelLink提供给Coder的接口主要就那么四个:SetTextColor、SetBackgroundColor、EnableTrack和SetLinkUrl。对于这四个接口,理解起来都是没有问题的。
首先我们需要关注的是如何设置控件的文本颜色和背景颜色。在MFC中,这通常是利用DialogBox的WM_CTLCOLOR消息中进行控件绘制。