有时我们需要在窗口上设置一个超链接,比如在Aboutdlg上设置“我的博客”这样的超链接.具体的设置方法如下。
1、首先我们在窗体上添加一个Static文本控件,修改Caption属性,设置成你想要的超链接标题,比如“更多内容欢迎访问小梦的博客”等。

2、这步很重要。由于Static控件不具备设置超链接的能力,我们需要重写一个继承自CStatic的类CHyperLink.
这里可以直接复制两个文件到你的工程当中。
HyperLink.h头文件:

#pragma once
// CHyperLink
class CHyperLink : public CStatic
{DECLARE_DYNAMIC(CHyperLink)public:CHyperLink();virtual ~CHyperLink();public: void SetURL(CString strURL);CString GetURL() const;void SetColor(COLORREF clr,BYTE clrItem);//设置颜色COLORREF GetColor(BYTE clrItem);//得到颜色// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CHyperLink)
protected:virtual void PreSubclassWindow();//}}AFX_VIRTUAL// Implementation
protected:int GotoURL(LPCTSTR url, int showcmd);// Protected attributes
protected:COLORREF m_clrHot;      // Link normal colorCOLORREF m_clrNor;      // Link active colorCOLORREF m_clrBG;       // Link active colorBOOL     m_bHot;                // Is the link active?CString  m_strURL;                  // Hyperlink URL string// Generated message map functions
protected://{{AFX_MSG(CHyperLink)afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnPaint();afx_msg LRESULT  OnMouseHover(WPARAM wParam,LPARAM lParam);afx_msg LRESULT  OnMouseLeave(WPARAM wParam,LPARAM lParam);afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);protected:DECLARE_MESSAGE_MAP()
};

然后是HyperLink.cpp文件:

// HyperLink.cpp : 实现文件
//#include "stdafx.h"
#include "MyPlayer.h"
#include "HyperLink.h"
//上面三个头文件利用类向导创建的话会自动生成,如果是手动创建,需要添加// CHyperLinkIMPLEMENT_DYNAMIC(CHyperLink, CStatic)CHyperLink::CHyperLink()
{m_bHot              = FALSE;    // Control doesn't own the focus yetm_strURL.Empty();               // Set URL to an empty stringm_clrHot = RGB(0,0,255);m_clrNor = RGB(0,0,255);m_clrBG = RGB(240,240,240);
}CHyperLink::~CHyperLink()
{
}BEGIN_MESSAGE_MAP(CHyperLink, CStatic)//{{AFX_MSG_MAP(CHyperLink)ON_WM_MOUSEMOVE()ON_WM_LBUTTONUP()ON_WM_PAINT()ON_MESSAGE(WM_MOUSEHOVER,&OnMouseHover)ON_MESSAGE(WM_MOUSELEAVE,&OnMouseLeave)ON_WM_SETCURSOR()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////void CHyperLink::PreSubclassWindow() {// TODO: Add your specialized code here and/or call the base classDWORD dwStyle = GetStyle();::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY);//  SetFont(GetParent()->GetFont());CStatic::PreSubclassWindow();}void CHyperLink::OnMouseMove(UINT nFlags, CPoint point) {TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); tme.hwndTrack = m_hWnd; tme.dwFlags = TME_LEAVE | TME_HOVER; tme.dwHoverTime =  1; _TrackMouseEvent(&tme); //  CStatic::OnMouseMove(nFlags, point);}//鼠标在上面LRESULT CHyperLink::OnMouseHover(WPARAM wParam,LPARAM lParam){   if (!m_bHot){m_bHot = TRUE; Invalidate();}  return TRUE;}//鼠标离开LRESULT CHyperLink::OnMouseLeave(WPARAM wParam,LPARAM lParam){m_bHot = FALSE;Invalidate();return TRUE;}void CHyperLink::OnLButtonUp(UINT nFlags, CPoint point) {if (m_strURL.IsEmpty()){GetWindowText(m_strURL);}GotoURL(m_strURL, SW_SHOW);}/////////////////////////////////////////////////////////////////////////////// CHyperLink operationsvoid CHyperLink::SetURL(CString strURL){m_strURL = strURL;}CString CHyperLink::GetURL() const { return m_strURL;   }int CHyperLink::GotoURL(LPCTSTR url, int showcmd){HINSTANCE result = ShellExecute(NULL, _T("open"), url, NULL,NULL, showcmd); return (int)result;}void CHyperLink::OnPaint() {CPaintDC dc(this); // device context for painting   // TODO: Add your message handler code hereCFont* pFont = GetFont();CFont m_Font;if (pFont != NULL){LOGFONT lf;pFont->GetLogFont(&lf);lf.lfUnderline = m_bHot;if (m_Font.CreateFontIndirect(&lf))dc.SelectObject(m_Font);}if (m_bHot){   dc.SetTextColor(m_clrHot);}else{dc.SetTextColor(m_clrNor);}dc.SetBkMode(TRANSPARENT);///准备工作CRect rect;CBrush BGBrush,*pOldBrush;int nTextLeft=4,nTextTop=2; //文字输出的位置this->GetClientRect(&rect);//画背景BGBrush.CreateSolidBrush(m_clrBG);pOldBrush=dc.SelectObject(&BGBrush);dc.FillRect(&rect,&BGBrush);dc.SelectObject(pOldBrush);BGBrush.DeleteObject();///输出文字TEXTMETRIC tm;dc.GetTextMetrics(&tm);CString strText;this->GetWindowText(strText);nTextTop=rect.top+(rect.Height()-tm.tmHeight)/2;if(strText.GetLength()>0){dc.TextOut(nTextLeft,nTextTop,strText);}   BGBrush.DeleteObject();m_Font.DeleteObject();}BOOL CHyperLink::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) {// TODO: Add your message handler code here and/or call defaultif (m_bHot){::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(32649)));return TRUE;}return CStatic::OnSetCursor(pWnd, nHitTest, message);}

3、第2步可以直接使用,不用修改。然后真正使用超链接的是后面几步。在你的父窗口类中添加成员变量:

private:CHyperLink m_stWeb;       //超链接至我的博客

4、这一步比较关键,因为我们是手动创建的变量,需要将m_stWeb和第一步的静态控件关联。具体在

void CMyPlayerDlg::DoDataExchange(CDataExchange* pDX)
{//....//IDC_STATIC_blog是该静态文本控件的IDDDX_Control(pDX, IDC_STATIC_blog, m_stWeb);
}

5、最后一步,在Oninitdialog函数中添加:

m_stWeb.SetURL("http://blog.csdn.net/u013051748");
//修改成你自己的超链接地址

ok,到这里运行就能发现,当鼠标移动到文字上时,文字具有下划线,同时鼠标变成手型,点击之后系统会调用默认的浏览器打开该链接。仔细观察你会发现,执行打开的函数依然是ShellExecute(NULL, _T(“open”), url, NULL,NULL, showcmd);这个函数windows版本的exec函数。

到这里就能成功实现文本的超链接了。
如下:

到现在基本是没什么事了,就剩下写写论文了,所以没事也就自己再添加一些功能,DIY一下什么的,比如上面的超链接。

                             拙见,小记!

MFC静态文本控件设置超链接相关推荐

  1. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应...

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

  2. VC设置静态文本控件的显示字体和显示内容

    首先,在对话框上添加一个Static控件,关联一个控制变量m_static(不是Value,是Control) 然后,建立一个字体变量 private:CFont m_Font; 然后,在对话框初始化 ...

  3. python精要(82)-wxpython(3)-静态文本控件与状态栏

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Mon Feb 22 08:35:42 202 ...

  4. 文本显示器--静态文本控件之文本绘制输出

    花了几天的时间才慢慢整理出静态文本控件的文字输出. 主要考虑到文字的左对齐,水平居中对齐,右对齐.靠上对齐,垂直居中对齐,靠下对齐. 最麻烦的是除了要考虑上面的对齐问题,还要考虑文字输出的裁剪.如当前 ...

  5. 文本显示器-静态文本控件功能一览

    静态文本显示控件的功能基本定型了. 顾名思义,静态文本就是显示预先设定好的静态文本字符串. 字符串可以支持任意字符,可以在任意位置显示. 字符串水平方向支持 左/中/右三种对齐方式. 垂直方向支持 上 ...

  6. pyqt控件设置超链接不跳转

    利用pyqt5做了一个测试小软件,需要在一个控件上添加超链接,经过一上午的资料查询,验证了两种方式可行(当然还有其他方式,没在一一验证):一:label文本超链接 self.label_3.setTe ...

  7. wxpython基本控件-静态文本控件

    #coding=utf-8 import wx class StaticTextFrame(wx.Frame):def __init__(self):wx.Frame.__init__(self,No ...

  8. MFC中静态文本控件显示的几种实现方式

    示例如下: 1.DDX_TEXT: .h文件声明:CString m_flashplayerversion; .cpp调用:           DDX_Text(pDX,IDC_STATIC_Fla ...

  9. MFC第一课 控件使用技巧

    MFC控件使用技巧:Static Text 1)单独设置某个静态文本控件的属性: 颜色,字体大小 解决方案:需要指定一个独特的ID,默认情况下,所有的 静态文本框的ID是一致的 2)设置按钮的文本的时 ...

最新文章

  1. aptana对齐快捷键ctrl+shift+f
  2. kotlin开发经验谈3
  3. python日志模块备份_Python Logging模块 输出日志颜色、过期清理和日志滚动备份
  4. eclipse中下载spring-tool-suite插件遇到的问题
  5. 本地计算机上的mysql服务怎么注册,本地计算机上的mysql服务启动后中止
  6. 数据库连接字符串 mysql_数据库连接字符串(MySQL,SQL Server,Oracle)
  7. 使用JavaScript重定向URL参数
  8. MVC模式利用xib文件定制collectionCell
  9. window注册表详解
  10. matlab鲍威尔方法求函数,基于MATLAB的鲍威尔法求极值问题.doc
  11. 用大白话讲解Carplay(原创)
  12. C++ 控制台编译时显示‘ ld returned 1 exit status’
  13. 如何根据历史数据监控当前数据是否异常
  14. 清华教授花费1年总结python学习路线共26章,学会它offer拿到手软
  15. dht11 python mysql,通过python脚本将arduino传感器数据发送到mysql数据库时出现问题
  16. python插入excel文件数据(递增+随机)
  17. 计算机集成制造相关文献,计算机集成制造专著类参考文献 计算机集成制造期刊参考文献哪里找...
  18. X-Powered-by
  19. java properties 遍历_如何遍历properties文件的键值对并放置到application作用域里
  20. 你可能学了假流程图,三步教会你绘制大厂流程图(第一篇)

热门文章

  1. java三角形创建子类_如何创建子类,以便参数属于Java中的子类类型
  2. Linux下进程通信知识点学习笔记(一)
  3. 基于人脸识别、姿态检测、距离估计的看电视姿态检测
  4. keras 的 example 文件 mnist_siamese.py 解析
  5. 全国计算机建模三等奖,2009年全国数学建模真题(论文获国家 三等奖).doc
  6. ubuntu安装OpenCV详细教程(建议收藏)
  7. 估计点云中的曲面法线
  8. 【透明版九宫格背景图片】仅依靠background的几个属性组合搭配出酷炫的透明背景卡片效果→适用于大数据可视化、数据大屏展示页面
  9. 【Vue版】实现拖拽、排序效果(注意,这个方法在chrome谷歌浏览器上面不适用,dragend会情不自禁触发drag事件先执行,有点像浏览器的一个bug)
  10. VS2019生成C++开发的exe文件可以在无VS的PC上运行的方法