VC++6.0实现超链接

VC++6.0实现超链接
2011年05月03日
  一直不太会用VC,最近补习中。今天想要用静态文本模拟一个超链接,以为很简单(以前用VB确实很简单),结果发现要把变色,加下划线,变手形鼠标等模拟出来,还有点麻烦呢。搜索了半天,没有找到一个书面的完整解决方案,试着下载那个传说中重载CStatic来实现的类,结果水平不足,弄得头晕脑胀,还是编译不通过。一怒之下,自己研究了半天,终于比较完美的实现了,先发出来纪念下,以后熟悉VC点后也做成类吧。
  首先,新建一个基于对话框的工程,添加一个静态文本框,ID为IDC_HTML。Caption为http://www.baidu.com/。然后添加单击消息映射,添加以下代码:
  void CMyDlg::OnHtml()
  {
  // TODO: Add your control notification handler code here
  //静态文本框的notify设置为true才能响应点击等
  ShellExecute(NULL,"open", "http://www.baidu.com/",NULL,NULL,SW_SHOW );
  }
  基本的超链接功能算是实现了,很简单。不过模拟其他超链接的特效才是重点!在对话框实现文件中,添加几个全局变量,如下:
  BOOL bBlue=FALSE;
  CFont cfont1;
  CFont cfont2;
  在对话框初始化函数,OnInitDialog中加入以下初始化代码:
  // TODO: Add extra initialization here
  CWnd* pWnd = GetDlgItem(IDC_HTML);
  LOGFONT lf;
  pWnd->GetFont()->GetLogFont(&lf); //得到静态文本框的逻辑字体
  lf.lfUnderline=TRUE;
  cfont1.CreateFontIndirect(&lf); //修改字体1带下划线
  lf.lfUnderline=FALSE;
  cfont2.CreateFontIndirect(&lf); //修改字体2不带下划线
  在ClassWizard中加入WM_CTLCOLOR消息映射。当控件需要重绘的时候,会发送这个消息给父窗口,可以在这个消息发送时,修改控件的字体和背景颜色。在消息映射函数中加入以下代码:
  HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  {
  HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  // TODO: Change any attributes of the DC here
  if (pWnd->GetDlgCtrlID()==IDC_HTML)
  {
  if (bBlue)
  {
  pDC->SetTextColor(RGB(0,0,255)); //如果鼠标在文本上,设置颜色为蓝色
  GetDlgItem(IDC_HTML)->SetFont(&cfont2); //设置下划线
  }
  else
  {
  pDC->SetTextColor(RGB(255,0,0)); //设置初始颜色为红色
  GetDlgItem(IDC_HTML)->SetFont(&cfont1); //取消下划线
  }
  }
  // TODO: Return a different brush if the default is not desired
  return hbr;
  }
  在ClassWizard中加入WM_SETCURSOR消息映射。当鼠标在控件上移动的时候会发送 WM_SETCURSOR消息。在消息映射函数中添加处理代码:
  BOOL CMyDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  {
  // TODO: Add your message handler code here and/or call default
  //移动到静态文本上,鼠标变为手
  switch(pWnd-> GetDlgCtrlID())
  {
  case IDC_HTML: //静态控件的ID
  SetCursor(AfxGetApp()-> LoadCursor(IDC_CURSOR1)); //IDC_CURSOR1是我自己导入手形鼠标,也可以使用系统自带
  if (!bBlue) //bBlue为字体是否蓝色的标志位
  {
  bBlue=TRUE;
  Invalidate(); //强制刷新,使控件重绘,然后在WM_CTLCOLOR消息处理函数中对文本颜色和字体进行处理
  }
  return TRUE;
  }
  return CDialog::OnSetCursor(pWnd, nHitTest, message);
  }
  在ClassWizard中加入WM_MOUSEMOVE消息映射。当鼠标在窗体上移动的时候会发送 WM_MOUSEMOVE消息,可用来判断鼠标不在静态文本上。在消息映射函数中添加处理代码:
  void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)
  {
  // TODO: Add your message handler code here and/or call default
  CWnd* pWnd = GetDlgItem(IDC_HTML);
  if( NULL != pWnd )
  {
  CRect r ;
  pWnd->GetWindowRect(&r);
  ScreenToClient(&r);
  //如果鼠标不在静态文本上方且标志位为TRUE,则将标志位置FALSE
  if( !(point.x>r.left && point.xr.top && point.y<r.bottom) && bBlue )
  {
  bBlue=FALSE;
  Invalidate();
  }
  }
  CDialog::OnMouseMove(nFlags, point);
  }
  然后大功告成了^_^,VC灰常灰常菜,不要耻笑哈
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值