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;
}
页:
[1]