// StaticEx.cpp : 实现文件
//
#include "stdafx.h"
#include "StaticEx.h"
// CStaticEx
IMPLEMENT_DYNAMIC(CStaticEx, CStatic)
/*
* 构造函数
*/
CStaticEx::CStaticEx()
{
m_color = RGB(0, 0, 0);
m_color_before = RGB(0, 0, 0);
m_color_after = RGB(0, 0, 0);
m_if_hand = false;
m_if_link = false;
m_if_flash = false;
m_mouseTrack = true;
m_cursor = ::LoadCursor(NULL, IDC_HAND);
}
/*
* 析构函数
*/
CStaticEx::~CStaticEx()
{
m_font.DeleteObject();
}
BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_MOUSELEAVE()
ON_WM_TIMER()
ON_WM_MOUSEHOVER()
END_MESSAGE_MAP()
/*
* 子窗口预处理(获取原先字体)
*/
void CStaticEx::PreSubclassWindow()
{
CFont* font = GetFont();
if(font != NULL)
font->GetObject(sizeof(m_lf),&m_lf);
else
GetObject(GetStockObject(SYSTEM_FONT),sizeof(m_lf),&m_lf);
ReconstructFont();
CStatic::PreSubclassWindow();
}
/*
* 绘制控件区域
*/
void CStaticEx::OnPaint()
{
CPaintDC dc(this);
// 取得位置
CRect client_rect;
GetClientRect(client_rect);
// 取得文本
CString strText;
GetWindowText(strText);
// 设置透明模式、字体颜色、字体样式,然后重写文字
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(m_color);
dc.SelectObject(&m_font);
dc.DrawText(strText, client_rect, 0);
}
/*
* 鼠标在控件区域上移动时
*/
void CStaticEx::OnMouseMove(UINT nFlags, CPoint point)
{
// 鼠标要追踪WM_MOUSELEAVE事件
if (m_mouseTrack) {
TRACKMOUSEEVENT csTME;
csTME.cbSize = sizeof(csTME);
csTME.dwFlags = TME_LEAVE | TME_HOVER; // 指定要追踪的事件
csTME.dwHoverTime = 100;
csTME.hwndTrack = m_hWnd; // 指定要追踪的窗口
::_TrackMouseEvent(&csTME); // 开启Windows的WM_MOUSELEAVE事件支持
m_mouseTrack = false; // 若已经追踪,则停止追踪
}
// 如果设置为移入时鼠标的形状为手形时
if(m_if_hand == true)
::SetCursor(m_cursor);
// 如果设置为链接模式时
if(m_if_link == true) {
::SetCursor(m_cursor);
}
CStatic::OnMouseMove(nFlags, point);
}
/*
* 鼠标停在控件区域上时
*/
void CStaticEx::OnMouseHover(UINT nFlags, CPoint point)
{
// 如果设置为链接模式时
if(m_if_link == true) {
m_lf.lfUnderline = true;
ReconstructFont();
UpdateCtrlArea();
}
CStatic::OnMouseHover(nFlags, point);
}
/*
* 鼠标离开控件区域时
*/
void CStaticEx::OnMouseLeave()
{
// 如果设置为链接模式时
if(m_if_link == true) {
m_lf.lfUnderline = false;
ReconstructFont();
UpdateCtrlArea();
}
m_mouseTrack = true;
CStatic::OnMouseLeave();
}
/*
* 定时器
*/
void CStaticEx::OnTimer(UINT_PTR nIDEvent)
{
switch(nIDEvent) {
case TIMER_FONT_FLASH:
if(m_flash_state == BEFORE) { // flash字体状态为变化前
m_color = m_color_after;
m_flash_state = AFTER;
}
else { // flash字体状态为变化后
m_color = m_color_before;
m_flash_state = BEFORE;
}
UpdateCtrlArea();
break;
}
CStatic::OnTimer(nIDEvent);
}
/*
* 更新控件区域
*/
void CStaticEx::UpdateCtrlArea()
{
CRect rc;
GetWindowRect(rc);
RedrawWindow();
GetParent()->ScreenToClient(rc);
GetParent()->InvalidateRect(rc, TRUE);
GetParent()->UpdateWindow();
}
/*
* 重构字体
*/
void CStaticEx::ReconstructFont()
{
m_font.DeleteObject();
m_font.CreateFontIndirectW(&m_lf);
}
/*
* 设置控件文字
*
* @param strText 文字内容
*/
void CStaticEx::SetText(CString &strText)
{
SetWindowText(strText);
UpdateCtrlArea();
}
/*
* 设置控件字体颜色
*
* @param color 字体的颜色值(0~255)
*/
void CStaticEx::SetTextColor(COLORREF color)
{
m_color = color;
UpdateCtrlArea();
}
/*
* 设置手型鼠标效果
*
* @param ifHand 是否有手型鼠标效果(true | false)
*/
void CStaticEx::SetHand(bool ifHand)
{
m_if_hand = ifHand;
}
/*
* 设置链接效果
*
* @param ifLink 是否有链接效果(true | false)
*/
void CStaticEx::SetLink(bool ifLink)
{
m_if_link = ifLink;
}
/*
* 设置字体是否有下划线
*
* @param ifUnderline 是否有下划线(true | false)
*/
void CStaticEx::SetFontUnderline(bool ifUnderline)
{
m_lf.lfUnderline = ifUnderline;
ReconstructFont();
UpdateCtrlArea();
}
/*
* 设置字体是否为粗体
*
* @param ifBold 是否为粗体(true | false)
*/
void CStaticEx::SetFontBold(bool ifBold)
{
m_lf.lfWeight = ifBold ? FW_BOLD : FW_NORMAL;
ReconstructFont();
UpdateCtrlArea();
}
/*
* 设置字体是否为斜体
*
* @param ifItalic 是否为斜体(true | false)
*/
void CStaticEx::SetFontItalic(bool ifItalic)
{
m_lf.lfItalic = ifItalic;
ReconstructFont();
UpdateCtrlArea();
}
/*
* 设置字体
*
* @param strName 字体名称(楷体 | 宋体 | 黑体...)
*/
void CStaticEx::SetFontName(const CString &strName)
{
_tcscpy(m_lf.lfFaceName, strName);
ReconstructFont();
UpdateCtrlArea();
}
/*
* 设置字体大小
*
* @param size 字体大小
*/
void CStaticEx::SetFontSize(int size)
{
CFont cf;
LOGFONT lf;
cf.CreatePointFont(size * 10, m_lf.lfFaceName);
cf.GetLogFont(&lf);
m_lf.lfHeight = lf.lfHeight;
m_lf.lfWidth = lf.lfWidth;
ReconstructFont();
UpdateCtrlArea();
}
/*
* 设置flash字体
*
* @param ifFlash 是否启用flash字体(true | false 主要用于关闭flash字体)
*/
void CStaticEx::SetFontFlash(bool ifFlash)
{
m_if_flash = ifFlash;
}
/*
* 设置flash字体
*
* @param ifFlash 是否启用flash字体(若ifFlash == false则不起作用)
* @param colorBefore 闪烁前的字体颜色
* @param colorAfter 闪烁后的字体颜色
* @param time 闪烁间隔时间
*/
void CStaticEx::SetFontFlash(bool ifFlash, COLORREF colorBefore, COLORREF colorAfter, int time)
{
m_if_flash = ifFlash;
if(m_if_flash == true) {
SetTextColor(colorAfter);
m_color_before = colorBefore;
m_color_after = colorAfter;
SetTimer(TIMER_FONT_FLASH, time, NULL);
}
}
- 1
- 2
前往页