hottracker.cpp

来自「管理项目进度工具的原代码」· C++ 代码 · 共 137 行

CPP
137
字号
// HotTracker.cpp: implementation of the CHotTracker class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "HotTracker.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#ifndef WM_NCMOUSELEAVE
#	define WM_NCMOUSELEAVE 0x000002A2
#endif

#ifndef TME_NONCLIENT
#	define TME_NONCLIENT   0x00000010
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CHotTracker::CHotTracker() : m_nHotRect(-1)
{

}

CHotTracker::~CHotTracker()
{

}

BOOL CHotTracker::Initialize(CWnd* pWnd)
{
	if (pWnd && pWnd->GetSafeHwnd() && HookWindow(*pWnd))
		return TRUE;

	return FALSE;
}

int CHotTracker::AddRect(const CRect& rect)
{
	m_aRects.Add((CRect&)rect);

	return m_aRects.GetSize() - 1;
}

int CHotTracker::AddRect()
{
	static CRect rTemp(0, 0, 0, 0);
	m_aRects.Add(rTemp);

	return m_aRects.GetSize() - 1;
}

BOOL CHotTracker::UpdateRect(int nRect, const CRect& rect)
{
	if (nRect < 0 || nRect >= m_aRects.GetSize())
		return FALSE;

	m_aRects[nRect] = rect;
	return TRUE;
}

int CHotTracker::HitTest(CPoint ptScreen)
{
	int nRect = m_aRects.GetSize();

	if (nRect)
	{
		ScreenToClient(&ptScreen);

		while (nRect--)
		{
			if (m_aRects[nRect].PtInRect(ptScreen))
				return nRect;
		}
	}

	return -1;
}

LRESULT CHotTracker::WindowProc(HWND /*hRealWnd*/, UINT msg, WPARAM /*wp*/, LPARAM /*lp*/)
{
	switch (msg)
	{
	case WM_NCMOUSELEAVE:
	case WM_MOUSELEAVE:
	case WM_NCMOUSEMOVE:
	case WM_MOUSEMOVE:
		if (m_aRects.GetSize())
		{
			int nRect = HitTest(::GetMessagePos());

			if (nRect != m_nHotRect)
			{
				SendMessage(WM_HTHOTCHANGE, m_nHotRect, nRect);
				m_nHotRect = nRect;
			}

			if (msg == WM_NCMOUSEMOVE || msg == WM_MOUSEMOVE)
				InitTracking();
		}
		break;
	}

	return Default();
}

void CHotTracker::InitTracking()
{
	if (m_aRects.GetSize())
	{
		// see if we're already tracking
		TRACKMOUSEEVENT tme = { sizeof(tme), TME_QUERY, GetHwnd(), 0 };

		if (_TrackMouseEvent(&tme) && (tme.dwFlags & (TME_LEAVE | TME_NONCLIENT)) != (TME_LEAVE | TME_NONCLIENT))
		{
			TRACKMOUSEEVENT tme = { sizeof(tme), TME_LEAVE | TME_NONCLIENT, GetHwnd(), 0 };
			_TrackMouseEvent(&tme);
		}
	}
}

void CHotTracker::Reset()
{
	m_aRects.RemoveAll();

	TRACKMOUSEEVENT tme = { sizeof(tme), TME_CANCEL | TME_LEAVE | TME_NONCLIENT, GetHwnd(), 0 };
	_TrackMouseEvent(&tme);

	HookWindow(NULL);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?