博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC中 用Static控件做超链接(可以实现变手形、下划线、字体变色等功能)
阅读量:4686 次
发布时间:2019-06-09

本文共 2939 字,大约阅读时间需要 9 分钟。

 

1、新建一个基于对话框的工程MyLink,在对话框中拖一个Static控件,ID可改为IDC_SLink。

2、在头文件中添加成员变量:

private:

 CRect m_Rect;
 CFont* m_cfNtr;
 CFont m_cfUL;
 LOGFONT m_lfNtr, m_lfUL;
 COLORREF m_color;
 CBrush m_brush;

 

3、在.cpp文件中利用类向导添加初始化虚函数,并添加代码:

BOOL CMyLinkDlg::OnInitDialog(){    CDialog::OnInitDialog();    // 将“关于...”菜单项添加到系统菜单中。    // IDM_ABOUTBOX 必须在系统命令范围内。    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);    ASSERT(IDM_ABOUTBOX < 0xF000);    CMenu* pSysMenu = GetSystemMenu(FALSE);    if (pSysMenu != NULL)    {        BOOL bNameValid;        CString strAboutMenu;        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);        ASSERT(bNameValid);        if (!strAboutMenu.IsEmpty())        {            pSysMenu->AppendMenu(MF_SEPARATOR);            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);        }    }    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动    //  执行此操作    SetIcon(m_hIcon, TRUE);            // 设置大图标    SetIcon(m_hIcon, FALSE);        // 设置小图标    // TODO: 在此添加额外的初始化代码    GetDlgItem(IDC_SLink)->GetWindowRect(&m_Rect);    ScreenToClient (&m_Rect);    m_cfNtr = this->GetFont();    m_cfNtr->GetLogFont ( &m_lfNtr );    m_cfNtr->GetLogFont ( &m_lfUL );    m_lfUL.lfUnderline = TRUE;    m_cfUL.CreateFontIndirect ( &m_lfUL );    m_brush.CreateSysColorBrush ( COLOR_MENU );    m_color = RGB (0,0,0);    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}

 

再利用类向导添加下面几个消息:

void CMyLinkDlg::OnLButtonUp(UINT nFlags, CPoint point){    // TODO: 在此添加消息处理程序代码和/或调用默认值    CString strLink;    UpdateData(TRUE);    GetDlgItem(IDC_SLink)->GetWindowText(strLink);    if (point.x > m_Rect.left && point.x < m_Rect.right && point.y < m_Rect.bottom && point.y > m_Rect.top )    {        ShellExecute (NULL, NULL, strLink,NULL, NULL, SW_NORMAL);    }    CDialog::OnLButtonUp(nFlags, point);}
void CMyLinkDlg::OnMouseMove(UINT nFlags, CPoint point){    // TODO: 在此添加消息处理程序代码和/或调用默认值    if ( point.x > m_Rect.left && point.x < m_Rect.right && point.y < m_Rect.bottom && point.y > m_Rect.top )    {        HCURSOR hCursor;        hCursor = ::LoadCursor ( NULL, IDC_HAND );        ::SetCursor ( hCursor );        GetDlgItem(IDC_SLink)->SetFont ( &m_cfUL );        m_color = RGB (0,0,225);        CStatic* m_pStatic = (CStatic*)GetDlgItem(IDC_SLink);        m_pStatic->RedrawWindow ();    }    else    {        GetDlgItem(IDC_SLink)->SetFont ( m_cfNtr );        m_color = RGB (0,0,0);        CStatic* m_pStatic = (CStatic*)GetDlgItem(IDC_SLink);        m_pStatic->RedrawWindow();    }    CDialog::OnMouseMove(nFlags, point);}
HBRUSH CMyLinkDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);    // TODO:  在此更改 DC 的任何属性    if ( nCtlColor == CTLCOLOR_STATIC )    {        pDC->SetBkMode ( TRANSPARENT );        pDC->SetTextColor ( m_color );        return (HBRUSH)m_brush.GetSafeHandle ();    }    // TODO:  如果默认的不是所需画笔,则返回另一个画笔    return hbr;}

效果图如下:

 

资料来源:

转载于:https://www.cnblogs.com/lxt287994374/p/3143473.html

你可能感兴趣的文章
python基础知识第二篇(字符串)
查看>>
php生成器使用总结
查看>>
T-SQL中的indexof函数
查看>>
javascript基础之数组(Array)对象
查看>>
mysql DML DDL DCL
查看>>
RAMPS1.4 3d打印控制板接线与测试1
查看>>
python with语句中的变量有作用域吗?
查看>>
24@Servlet_day03
查看>>
初级ant的学习
查看>>
redis数据结构--String
查看>>
POJ 3279 Fliptile (二进制枚举)
查看>>
memcached 细究(三)
查看>>
future
查看>>
关于main函数传参数的问题
查看>>
getTickCount()函数 VS GetTickCount()函数
查看>>
嵌入式jetty
查看>>
2017~回顾分享
查看>>
let const var的区别与作用
查看>>
计算出线在屏幕内的最长坐标
查看>>
使用svn——项目的目录布局
查看>>