找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 271|回复: 0

MFC中 用Static控件做超链接(可以实现变手形、下划线、字体变色等功能)

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-2-7 23:01:40 | 显示全部楼层 |阅读模式
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 = :oadCursor ( 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;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 14:42 , Processed in 0.129736 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表