阿L的b"L"og

posts(1) comments(0) trackbacks(0)
  • C++博客
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

常用链接

  • 我的随笔
  • 我的评论
  • 我参与的随笔

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • 代码设计(1)

随笔档案

  • 2006年2月 (1)

搜索

  •  

最新评论

2006年2月22日

与网页链接相似的CLinkStatic类

先创建一个类,见到Static可能会想继承自CStatic吧,其实我觉得继承自CWnd会更好,由于绘制等的都是自己写的,CStatic提供的东西没有用到.
添加以下两个成员变量

CString m_csTitle;  //显示的标题
CString m_csUrl;  //点击后跳到的URL

可以添加SetTitle和SetUrl两个函数给外部使用.

添加OnPain,OnMouseMove和OnLButtonDown几个函数,
OnPaint:把要显示的TITLE画出来,最好选个好看的字体,默认的字体好难看
OnMouseMove:鼠标在链接上移动时用SetCursor改变鼠标的图标,
OnLButtonDown:鼠标点击,随便调用ShellExecut用m_csUrl就可以了

如果想效果好一点,例如鼠标在链接上移动时改变链接的颜色或将文字变成有下划线(underline),可以在OnMouseMove中使用SetCapture捕捉鼠标,然后在程序里判断鼠标的移进移出,或者用TrackMouseEvent后就可以接受OnMouseEnter和OnMouseLeave了.

为了在使用时容易用,最好自己写一个Create,对了,如果继承自CStatic,创建时要加一个SS_NOTIFY的样式才可以接收那些OnLButtonDown的函数.

部分代码贴出来

/**//////////////////////////////////////////////////////////////////////////////
// CLinkStatic

CLinkStatic::CLinkStatic()
{
    m_ftDef.CreatePointFont(
90,"宋体");

    m_clrDef
=RGB(0,0,0xff);
    m_clrHover
=RGB(0xff,0,0);

    m_bHover
=FALSE;
}


BEGIN_MESSAGE_MAP(CLinkStatic, CWnd)
    
//{{AFX_MSG_MAP(CLinkStatic)
    ON_WM_MOUSEMOVE()
    ON_WM_PAINT()
    ON_WM_LBUTTONDOWN()
    
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/**//////////////////////////////////////////////////////////////////////////////
// CLinkStatic message handlers

void CLinkStatic::OnMouseMove(UINT nFlags, CPoint point) 
{
    CWnd::OnMouseMove(nFlags, point);

    CRect rt;
    GetClientRect(
&rt);
    
    
if(!rt.PtInRect(point))
    
{
        ReleaseCapture();
        m_bHover
=FALSE;
    }

    
else
    
{
        SetCapture();
        m_bHover
=TRUE;
        ::SetCursor(LoadCursor(NULL,IDC_HAND));
    }


    Invalidate();
}


void CLinkStatic::OnPaint()
{
    CPaintDC dc(
this); // device context for painting
    CFont *pOldFont=dc.SelectObject(&m_ftDef);
    
    CRect rt;
    GetClientRect(
&rt);
    
    dc.SetTextColor(m_bHover
?m_clrHover:m_clrDef);
    dc.SetBkMode(TRANSPARENT);
    dc.DrawText(m_csTitle,
&rt,DT_SINGLELINE|DT_VCENTER);

    dc.SelectObject(pOldFont);
}


void CLinkStatic::SetUrl(CString csUrl)
{
    m_csUrl
=csUrl;
}


void CLinkStatic::OnLButtonDown(UINT nFlags, CPoint point) 
{
    CWnd::OnLButtonDown(nFlags, point);

    
if(m_csUrl.IsEmpty())return;

    ShellExecute(NULL,
"open",m_csUrl,NULL,NULL,SW_SHOW);

    ReleaseCapture();
    m_bHover
=FALSE;
    Invalidate();
}


BOOL CLinkStatic::Create(CString csTitle, CWnd 
*pParant, CRect rt/**//*=CRect(0,0,0,0)*/)
{
    
if(CWnd::Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rt,pParant,0xffff)==FALSE)
        
return FALSE;
    m_csTitle
=csTitle;
    
return TRUE;
}

posted @ 2006-02-22 15:50 阿L 阅读(317) | 评论 (0) | 编辑 收藏

仅列出标题  
 
Powered by:
C++博客
Copyright © 阿L