VC制作超聯(lián)接控件
發(fā)表時(shí)間:2024-02-21 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]同濟(jì)大學(xué) 羅筱波 ---- 在當(dāng)今的網(wǎng)絡(luò)時(shí)代,超聯(lián)接無所不在,在各種各樣的軟件上我們都可以看到它的存在,這幾乎成了一個(gè)必不可少的一項(xiàng)宣傳內(nèi)容。如果能在自己的程序中加入一個(gè)超聯(lián)接,那么會(huì)使我們的程序帶上鮮明的網(wǎng)絡(luò)特征。但是在vc6.0中并沒有提供一個(gè)用于制作超聯(lián)接的控件,因此只有自己編寫實(shí)現(xiàn)此功能的...
同濟(jì)大學(xué)
羅筱波
---- 在當(dāng)今的網(wǎng)絡(luò)時(shí)代,超聯(lián)接無所不在,在各種各樣的軟件上我們都可以看到它的存在,這幾乎成了一個(gè)必不可少的一項(xiàng)宣傳內(nèi)容。如果能在自己的程序中加入一個(gè)超聯(lián)接,那么會(huì)使我們的程序帶上鮮明的網(wǎng)絡(luò)特征。但是在vc6.0中并沒有提供一個(gè)用于制作超聯(lián)接的控件,因此只有自己編寫實(shí)現(xiàn)此功能的程序。下面是本人編寫的一個(gè)實(shí)現(xiàn)超聯(lián)接的類,希望能與大家分享。
---- 制作思路是:從類CStatic 派生出一個(gè)子類CsuperLinkCtrl,然后為子類CsuperLinkCtrl加入適當(dāng)?shù)暮瘮?shù)使其能響應(yīng)鼠標(biāo)的消息和實(shí)現(xiàn)超聯(lián)接的功能。制作過程如下:
---- 一、首先從類CStatic 派生出一個(gè)子類CsuperLinkCtrl,用classwizard生成的頭文件具體代碼如下:
class CSuperLinkCtrl : public CStatic
{
// Construction
public:
CSuperLinkCtrl();
CSuperLinkCtrl(COLORREF
clickedtextcor,COLORREF moveontextcor,COLORREF
ordinarytextcor);
// Attributes
public:
COLORREF m_crText; //超聯(lián)接文本的顏色
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSuperLinkCtrl)
//}}AFX_VIRTUAL
// Implementation
public:
BOOL SetLinkAddress(CString linkaddress);
//用于設(shè)置超聯(lián)接的地址
void MouseLeave(void);
void MouseEnter(void);
void SetLinkCursor(HCURSOR hCursor);
//用于設(shè)置超聯(lián)接的鼠標(biāo)形狀
void SetSuperLink(BOOL setlink);
virtual ~CSuperLinkCtrl();
// Generated message map functions
protected:
CString m_linktext; // shell 調(diào)用的聯(lián)接參數(shù)
BOOL m_bClicked; // 鼠標(biāo)是否單擊超聯(lián)接
HCURSOR m_hCursor; // 鼠標(biāo)移動(dòng)到超聯(lián)接上時(shí)的鼠標(biāo)形狀
//{{AFX_MSG(CSuperLinkCtrl)
afx_msg HBRUSH CtlColor(CDC* pDC,
UINT nCtlColor);
afx_msg void OnLButtonDown(UINT
nFlags, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd,
UINT nHitTest, UINT message);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
BOOL m_bcaptured; //捕捉鼠標(biāo)移動(dòng)
COLORREF m_clickedtextcor; //單擊超聯(lián)接后文本的顏色
COLORREF m_moveontextcor; //鼠標(biāo)移動(dòng)到超聯(lián)接時(shí)的文本的顏色
COLORREF m_ordinarytextcor; //未激活超聯(lián)接時(shí)文本的顏色
LOGFONT m_lf;
CFont m_font; //超聯(lián)接上的文本的字體
};
---- 二、為類編寫實(shí)現(xiàn)文件
---- 在類的兩個(gè)重載構(gòu)造函數(shù)中完成類的初始化工作
CSuperLinkCtrl::CSuperLinkCtrl()
{
m_bClicked=FALSE;
m_bcaptured=FALSE;
m_clickedtextcor=RGB(0,255,255);
m_moveontextcor=RGB(0,255,0);
m_ordinarytextcor=RGB(0,0,255);
m_crText=m_ordinarytextcor;
// 設(shè)置初始化字體顏色
::GetObject((HFONT)GetStockObject
(DEFAULT_GUI_FONT),sizeof(m_lf),&m_lf);
//取得當(dāng)前的缺省字體
m_lf.lfUnderline = TRUE;
//為當(dāng)前缺省字體加入下劃線
BOOL bCreated = m_font.CreateFontIndirect(&m_lf);
// 創(chuàng)建超聯(lián)接字體
ASSERT(bCreated);
m_hCursor=NULL;
}
CSuperLinkCtrl::CSuperLinkCtrl(COLORREF
clickedtextcor,COLORREF
moveontextcor,COLORREF ordinarytextcor)
{
m_bClicked=FALSE;
m_bcaptured=FALSE;
m_clickedtextcor=clickedtextcor;
m_moveontextcor=moveontextcor;
m_ordinarytextcor=ordinarytextcor;
m_crText=m_ordinarytextcor;
// 設(shè)置初始化字體顏色
::GetObject((HFONT)GetStockObject
(DEFAULT_GUI_FONT),sizeof(m_lf),&m_lf);
//取得當(dāng)前的缺省字體
m_lf.lfUnderline = TRUE;
//為當(dāng)前缺省字體加入下劃線
BOOL bCreated = m_font.CreateFontIndirect(&m_lf);
// 創(chuàng)建超聯(lián)接字體
ASSERT(bCreated);
m_hCursor=NULL;
}
在類的析構(gòu)函數(shù)中刪除在類的構(gòu)造函數(shù)中創(chuàng)建的字體
CSuperLinkCtrl::~CSuperLinkCtrl()
{
m_font.DeleteObject();
//刪除在類的構(gòu)造函數(shù)中創(chuàng)建的字體
}
用classwizard為類加入如下消息映射并編寫消息映射函數(shù)
BEGIN_MESSAGE_MAP(CSuperLinkCtrl, CStatic)
//{{AFX_MSG_MAP(CSuperLinkCtrl)
ON_WM_CTLCOLOR_REFLECT()
ON_WM_LBUTTONDOWN()
ON_WM_SETCURSOR()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
編寫消息映射函數(shù)CtlColor()用于實(shí)現(xiàn)超聯(lián)接文本顏色的變化
HBRUSH CSuperLinkCtrl::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
if (CTLCOLOR_STATIC == nCtlColor)
{
pDC->SelectObject(&m_font);
pDC->SetTextColor(m_crText);
pDC->SetBkMode(TRANSPARENT);
}
HBRUSH hBrush = ::CreateSolidBrush
(GetSysColor(COLOR_3DFACE)); //創(chuàng)建一個(gè)刷子句柄
return hBrush; // 返回一個(gè)用來畫控件背景的刷子句柄
}
實(shí)現(xiàn)鼠標(biāo)按下左鍵消息
void CSuperLinkCtrl::OnLButtonDown
(UINT nFlags, CPoint point)
{
// TODO: Add your message handler
code here and/or call default
m_bClicked=TRUE;
m_crText=m_clickedtextcor; //設(shè)置超聯(lián)接文本的顏色
RedrawWindow(); // 重畫控件實(shí)現(xiàn)超聯(lián)接文本顏色的變化
if(m_linktext!="")
//如果設(shè)置了超聯(lián)接的地址則調(diào)用
ShellExecute函數(shù)實(shí)現(xiàn)超聯(lián)接
ShellExecute(NULL, "open", m_linktext,
NULL, NULL, SW_SHOWNORMAL);
CStatic::OnLButtonDown(nFlags, point);
// 調(diào)用基類響應(yīng)函數(shù)
}
設(shè)置超聯(lián)接文本上的鼠標(biāo)形狀的消息映射函數(shù)
BOOL CSuperLinkCtrl::OnSetCursor(CWnd* pWnd,
UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
if (m_hCursor) // 如果已取得光標(biāo)句柄則設(shè)置新的鼠標(biāo)形狀
{
::SetCursor(m_hCursor);
return TRUE;
}
return CStatic::OnSetCursor(pWnd, nHitTest, message);
}
設(shè)置超聯(lián)接文本上的光標(biāo)句柄
void CSuperLinkCtrl::SetLinkCursor(HCURSOR hCursor)
{
m_hCursor = hCursor;
}
響應(yīng)鼠標(biāo)移動(dòng)消息
void CSuperLinkCtrl::OnMouseMove
(UINT nFlags, CPoint point)
{
// TODO: Add your message handler
code here and/or call default
SetCapture(); // 捕捉鼠標(biāo)
POINT mpoint;
GetCursorPos(&mpoint); // 取得當(dāng)前鼠標(biāo)位置
CRect rect;
GetWindowRect(&rect); // 取得控件的窗口大小
if(!rect.PtInRect(mpoint)) // 判斷鼠標(biāo)是否在控件的窗口內(nèi)
{ // 鼠標(biāo)不在控件的窗口內(nèi)
m_bcaptured=FALSE;
ReleaseCapture(); // 釋放鼠標(biāo)捕捉
MouseLeave(); // 調(diào)用mouseleave()函數(shù)
return;
}
// 鼠標(biāo)在控件的窗口內(nèi)
if(m_bcaptured) // 如果鼠標(biāo)在窗口內(nèi)且已經(jīng)被捕捉則返回
return;
m_bcaptured=TRUE;
MouseEnter(); //調(diào)用MouseEnter()函數(shù)
ReleaseCapture(); // 釋放鼠標(biāo)捕捉
CStatic::OnMouseMove(nFlags, point); // 調(diào)用基類響應(yīng)函數(shù)
}
在MouseEnter()和MouseLeave()
函數(shù)中設(shè)置鼠標(biāo)進(jìn)入和離開時(shí)的超聯(lián)接文本的顏色
void CSuperLinkCtrl::MouseEnter()
{
m_crText=m_bClicked? m_clickedtextcor : m_moveontextcor;
RedrawWindow(); // 重畫控件實(shí)現(xiàn)超聯(lián)接文本顏色的變化
}
void CSuperLinkCtrl::MouseLeave()
{
m_crText=m_bClicked? m_clickedtextcor : m_ordinarytextcor;
RedrawWindow(); // 重畫控件實(shí)現(xiàn)超聯(lián)接文本顏色的變化
}
在SetLinkAddress()函數(shù)中設(shè)置超聯(lián)接到地址
BOOL CSuperLinkCtrl::SetLinkAddress(CString linkaddress)
{ // 驗(yàn)證地址的合法性
if(linkaddress.Find("http")!=-1)
m_linktext=linkaddress;
else if(linkaddress.Find("@")!=-1)
m_linktext="mailto:"+linkaddress;
else
{
MessageBox("Error: wrong superlink format");
m_linktext="";
return FALSE;
}
return TRUE;
}
---- 由于static控件并不響應(yīng)鼠標(biāo)消息,所以還需在派生的子類中作些修改。下面函數(shù)是使static控件能響應(yīng)鼠標(biāo)消息的關(guān)鍵(因?yàn)橥ǔtatic控件只能響應(yīng)很少一部分消息)
void CSuperLinkCtrl::SetSuperLink(BOOL setlink)
{
if (setlink) // 此處必須加入ModifyStyle(),
使static控件能響應(yīng)鼠標(biāo)消息
ModifyStyle(0,SS_NOTIFY);
else
ModifyStyle(SS_NOTIFY,0);
}
---- 至此類CsuperLinkCtrl已制作完成便可在其它程序中使用了。
---- 使用方法有兩種:一是用classwizard使一個(gè)static控件與一個(gè)CsuperLinkCtrl變量相關(guān)聯(lián),另一種方法是定義一個(gè)CsuperLinkCtrl變量然后用SubclassDlgItem()使它與一個(gè)static控件相關(guān)聯(lián)。
---- 使用示例:
---- 首先將SuperLinkCtrl1.h和SuperLinkCtrl1.cpp加入到工程的目錄中,然后定義一個(gè)變量CSuperLinkCtrl m_test; 然后在對(duì)話框中加入一個(gè)static控件,設(shè)置其ID為IDC_STATICTEST,之后在對(duì)話框的OnInitDialog()函數(shù)中加入如下代碼即可
m_test.SubclassDlgItem(IDC_STATICTEST,this);
// IDC_STATICTEST是一個(gè)需要子類化的static控件的ID
m_test.SetSuperLink(TRUE); //設(shè)置控件為超聯(lián)接控件
m_test.SetLinkCursor(AfxGetApp()->
LoadCursor(IDC_CURSORHAND));
// 設(shè)置超聯(lián)接控件的鼠標(biāo)形狀
m_test.SetLinkAddress("xxxx@citiz.net");
// 設(shè)置超聯(lián)接的地址
---- 怎么樣,趕緊試一下吧!