先上图
上面这个是鼠标移上去的效果,鼠标离开后即刻恢复原始状态。
下面是完整的代码:
头文件
#pragma once
// CMyStatic
class CMyStatic : public CStatic
{
DECLARE_DYNAMIC(CMyStatic)
public:
CMyStatic();
virtual ~CMyStatic();
protected:
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
DECLARE_MESSAGE_MAP()
private:
COLORREF m_clrHoverTextColor;
COLORREF m_clrCurTextColor;
HBRUSH m_brBkgndHover;
HBRUSH m_brBkgndDefault;
bool m_bMouseTrack;
public:
void SetTextHoverColor(COLORREF clr);
void SetBackHoverColor(COLORREF clr);
};
源文件
// MyStatic.cpp : 实现文件
//
#include "stdafx.h"
#include "MyStatic.h"
// CMyStatic
IMPLEMENT_DYNAMIC(CMyStatic, CStatic)
CMyStatic::CMyStatic()
{
m_clrCurTextColor = 0;
m_clrHoverTextColor = RGB(255,255,255);
m_brBkgndDefault = GetSysColorBrush(COLOR_BTNFACE);
m_brBkgndHover = GetSysColorBrush(COLOR_HIGHLIGHT);
m_bMouseTrack = true;
}
CMyStatic::~CMyStatic()
{
DeleteObject(m_brBkgndDefault);
DeleteObject(m_brBkgndHover);
}
BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSEHOVER, &OnMouseHover)
ON_MESSAGE(WM_MOUSELEAVE, &OnMouseLeave)
//ON_WM_CTLCOLOR()
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
// CMyStatic 消息处理程序
void CMyStatic::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bMouseTrack)
{
TRACE("OnMouseMove\n");
m_bMouseTrack = false;
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_HOVER | TME_LEAVE;
//tme.dwHoverTime = HOVER_DEFAULT;
tme.dwHoverTime = 1;
tme.hwndTrack = m_hWnd;
_TrackMouseEvent(&tme);
}
CStatic::OnMouseMove(nFlags, point);
}
LRESULT CMyStatic::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
m_clrCurTextColor = m_clrHoverTextColor;
Invalidate();
TRACE("OnMouseHover\n");
return 0;
}
LRESULT CMyStatic::OnMouseLeave( WPARAM wParam, LPARAM lParam )
{
m_clrCurTextColor = 0;
m_bMouseTrack = true;
Invalidate();
TRACE("OnMouseLeave\n");
return 0;
}
HBRUSH CMyStatic::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(m_clrCurTextColor);
if (m_bMouseTrack)
return m_brBkgndDefault;
else
return m_brBkgndHover;
}
void CMyStatic::SetTextHoverColor( COLORREF clr )
{
m_clrHoverTextColor = clr;
}
void CMyStatic::SetBackHoverColor( COLORREF clr )
{
if (m_brBkgndHover)
{
DeleteObject(m_brBkgndHover);
}
m_brBkgndHover = CreateSolidBrush(clr);
}
使用方法:
1、在窗口上添加Static Text控件
2、修改控件ID(不要用默认的),设置Notify属性为True
3、右键点击控件添加变量,类型填CMyStatic,名称m_static
4、在对话框的头文件中添加#include "MyStatic.h"
5、在对话框OnInitDialog()函数中设置自己想到的颜色代码如下:
m_static1.SetBackHoverColor(RGB(255,0,0));
m_static1.SetTextHoverColor(RGB(255,255,0));
至此就大功告成了,如果有什么不对的地方欢迎大家指正!!!