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消息中進行控件繪制。