MFC中 用Static控件做超鏈接(可以實現變手形、下划線、字體變色等功能)


 

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;
}

效果圖如下:

 

資料來源:http://www.pudn.com/downloads513/sourcecode/windows/shell/detail2129288.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM