中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
扩展CStatic支持颜色及热跟踪
作者:未知 时间:2005-09-13 23:28 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:扩展CStatic支持颜色及热跟踪
原理:重载CStatic,响应WM_CTLCOLOR消息,实现对颜色的支持;响应WM_MOUSEMOVE并跟踪WM_MOUSEHOVER和WM_MOUSELEAVE消息,实现热跟踪功能。

LabelEx.h

#ifndef __LabelEx_h__
#define __LabelEx_h__

// ############################################################################
// # Definition of CLabelEx

class CLabelEx: public CStatic
{
DECLARE_DYNAMIC(CLabelEx)

// Constructor/Destructor
public:
CLabelEx();

// Attributes
public:
void SetTextColor(COLORREF clrText);
void SetHotTextColor(COLORREF clrHotText);
void SetBgColor(COLORREF clrBack);

void EnableHotTrack(BOOL bHotTrack);

// Overloaded funtions
protected:
virtual void PreSubclassWindow();

// Member varibles
protected:
COLORREF m_clrText;
COLORREF m_clrHotText;
COLORREF m_clrBack;
CBrush m_brBkgnd;
BOOL m_bHotTrack;

BOOL m_bHover;

// Handlers of the messages
protected:
afx_msg HBRUSH CtlColor(CDC *pDC, UINT nCtlColor);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
};

// ############################################################################

#endif //__LabelEx_h__

LabelEx.cpp
#include "StdAfx.h"
#include "LabelEx.h"

IMPLEMENT_DYNAMIC(CLabelEx, CStatic)

// ############################################################################
// # Map the messages

BEGIN_MESSAGE_MAP(CLabelEx, CStatic)
ON_WM_CTLCOLOR_REFLECT()
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()

// ############################################################################


// ############################################################################
// # CLabelEx constructor/destructor

CLabelEx::CLabelEx()
{
m_clrHotText = m_clrText = RGB(0, 0, 0);
m_clrBack = ::GetSysColor(COLOR_3DFACE);
m_brBkgnd.CreateSolidBrush(m_clrBack);
m_bHotTrack = FALSE;

m_bHover = FALSE;
}

// ############################################################################


// ############################################################################
// # CLabelEx attributes

void CLabelEx::SetTextColor(COLORREF clrText)
{
m_clrText = clrText;
this->Invalidate();
}

void CLabelEx::SetHotTextColor(COLORREF clrHotText)
{
m_clrHotText = clrHotText;
this->Invalidate();
}

void CLabelEx::SetBgColor(COLORREF clrBack)
{
m_clrBack = clrBack;
this->Invalidate();
}

void CLabelEx::EnableHotTrack(BOOL bHotTrack)
{
m_bHotTrack = bHotTrack;
this->Invalidate();
}

// ############################################################################


// ############################################################################
// # CLabelEx overloaded functions

void CLabelEx::PreSubclassWindow()
{
DWORD dwStyle = this->GetStyle();
::SetWindowLong(this->GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY);

CStatic::PreSubclassWindow();
}

// ############################################################################


// ############################################################################
// # CLabelEx message handlers

HBRUSH CLabelEx::CtlColor(CDC *pDC, UINT nCtlColor)
{
if (m_bHover)
pDC->SetTextColor(m_clrHotText);
else
pDC->SetTextColor(m_clrText);
pDC->SetBkColor(m_clrBack);
return (HBRUSH)m_brBkgnd;
}

void CLabelEx::OnMouseMove(UINT nFlags, CPoint point)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = m_hWnd;
tme.dwHoverTime = HOVER_DEFAULT;
_TrackMouseEvent(&tme);

if (m_bHover) // Cursor is currently over control
{
CRect rect;
GetClientRect(rect);

if (!rect.PtInRect(point))
{
m_bHover = FALSE;
this->Invalidate();
::ReleaseCapture();
}
}
else // Cursor has just moved over control
{
m_bHover = TRUE;
this->Invalidate();
this->SetCapture();
// 这儿使用了偷懒的办法,
// 使用系统的手型光标只能在win2k或以上OS工作,
// 如果希望能在win95或win98下工作的话最好自己创建光标资源
if (m_bHotTrack)
::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(32649)));
}

CStatic::OnMouseMove(nFlags, point);
}

LRESULT CLabelEx::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bHover = FALSE;
this->Invalidate();
::ReleaseCapture();

return 0;
}

// ############################################################################
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有