⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hotedit.cpp

📁 深入剖析Visual C++编程技术及应用实例
💻 CPP
字号:
// HotEdit.cpp : implementation file
//

#include "stdafx.h"
#include "HotEdit.h"

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

/////////////////////////////////////////////////////////////////////////////
// CHotEdit

CHotEdit::CHotEdit()
{
	m_clr3DFace = GetSysColor(COLOR_3DFACE);
	m_clr3DLight = GetSysColor(COLOR_3DLIGHT);
	m_clr3DHilight = GetSysColor(COLOR_3DHILIGHT);
	m_clr3DShadow = GetSysColor(COLOR_3DSHADOW);
	m_clr3DDkShadow = GetSysColor(COLOR_3DDKSHADOW);

	m_fGotFocus = false;
	m_fTimerSet = false;
}

CHotEdit::~CHotEdit()
{
}


BEGIN_MESSAGE_MAP(CHotEdit, CEdit)
	//{{AFX_MSG_MAP(CHotEdit)
	ON_WM_PAINT()
	ON_WM_SETFOCUS()
	ON_WM_KILLFOCUS()
	ON_WM_MOUSEMOVE()
	ON_WM_TIMER()
	ON_WM_NCMOUSEMOVE()
	ON_WM_SYSCOLORCHANGE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHotEdit message handlers

void CHotEdit::OnPaint() 
{
	Default();

	if (m_fGotFocus) {
		DrawBorder();
	} else {
		DrawBorder(false);
	}
}

void CHotEdit::OnSetFocus(CWnd* pOldWnd) 
{
	CEdit::OnSetFocus(pOldWnd);
	
	m_fGotFocus = true;
	DrawBorder();
}

void CHotEdit::OnKillFocus(CWnd* pNewWnd) 
{
	CEdit::OnKillFocus(pNewWnd);

	m_fGotFocus = false;
	DrawBorder(false);
}

void CHotEdit::OnMouseMove(UINT nFlags, CPoint point) 
{
	if (!m_fGotFocus) 
	{
		//尚未获得输入焦点
		if (!m_fTimerSet) 
		{
		//Timer没有启动
			DrawBorder();
		//绘制边界
			SetTimer(1, 10, NULL);
		//启动时钟Timer
			m_fTimerSet = true;
		}
	}

	CEdit::OnMouseMove(nFlags, point);
}

void CHotEdit::OnTimer(UINT nIDEvent) 
{
	POINT pt;
	GetCursorPos(&pt);
	CRect rcItem;
	GetWindowRect(&rcItem);

	if(!rcItem.PtInRect(pt)) 
	{
		KillTimer(1);

		m_fTimerSet = false;

		if (!m_fGotFocus) 
		{
			DrawBorder(false);
		}
		return;
	}

	CEdit::OnTimer(nIDEvent);
}

void CHotEdit::OnNcMouseMove(UINT nHitTest, CPoint point) 
{
	if (!m_fTimerSet) {
		DrawBorder();
		SetTimer(1, 10, NULL);
		m_fTimerSet = true;
	}
	
	CEdit::OnNcMouseMove(nHitTest, point);
}

void CHotEdit::OnSysColorChange() 
{
	CEdit::OnSysColorChange();
	
	m_clr3DFace = GetSysColor(COLOR_3DFACE);
	m_clr3DLight = GetSysColor(COLOR_3DLIGHT);
	m_clr3DHilight = GetSysColor(COLOR_3DHILIGHT);
	m_clr3DShadow = GetSysColor(COLOR_3DSHADOW);
	m_clr3DDkShadow = GetSysColor(COLOR_3DDKSHADOW);
}

void CHotEdit::DrawBorder(bool fHot)
{
	CRect rcItem;
	DWORD dwExStyle = GetExStyle();
	//获取控件的扩展风格(这是由用户在资源编辑器中设置的)
	CDC* pDC = GetDC();
	COLORREF clrBlack;
	int nBorderWidth = 0;
	int nLoop;
	
	GetWindowRect(&rcItem);
	ScreenToClient(&rcItem);
	//获取控件的区域矩形
	clrBlack = RGB(0, 0, 0);
	//设置色彩
	if (!IsWindowEnabled()) 
	{
		fHot = true;
	}
	if (dwExStyle & WS_EX_DLGMODALFRAME) 
	{
		//模式对话框风格,边界加宽
		nBorderWidth += 3;
	}
	if (dwExStyle & WS_EX_CLIENTEDGE) 
	{
		//客户区边界的风格
		nBorderWidth += 2;
	}
	if (dwExStyle & WS_EX_STATICEDGE && !(dwExStyle & WS_EX_DLGMODALFRAME)) 
	{
		nBorderWidth ++;
	}

	for (nLoop = 0; nLoop < nBorderWidth; nLoop++) 
	{
		pDC->Draw3dRect(rcItem, m_clr3DFace, m_clr3DFace);
		//绘制3维矩形
		rcItem.DeflateRect(1, 1);
		//内缩矩形
	}
	rcItem.InflateRect(1, 1);
	//外扩矩形边界
	if (fHot) 
	{
	//如果鼠标位于控件上方,绘制凹形边界,否则为平面边界
		if (dwExStyle & WS_EX_CLIENTEDGE) 
		{
			pDC->Draw3dRect(rcItem, m_clr3DDkShadow, m_clr3DLight);
			rcItem.InflateRect(1, 1);
			pDC->Draw3dRect(rcItem, m_clr3DShadow, m_clr3DHilight);
			rcItem.InflateRect(1, 1);
		}

		if (dwExStyle & WS_EX_STATICEDGE && !(dwExStyle & WS_EX_DLGMODALFRAME)) 
		{
			pDC->Draw3dRect(rcItem, m_clr3DShadow, m_clr3DHilight);
			rcItem.InflateRect(1, 1);
		}

		if (dwExStyle & WS_EX_DLGMODALFRAME) 
		{
			pDC->Draw3dRect(rcItem, m_clr3DFace, m_clr3DFace);
			rcItem.InflateRect(1, 1);
			pDC->Draw3dRect(rcItem, m_clr3DHilight, m_clr3DShadow);
			rcItem.InflateRect(1, 1);
			pDC->Draw3dRect(rcItem, m_clr3DLight, m_clr3DDkShadow);
		}
	}

	ReleaseDC(pDC);
}

⌨️ 快捷键说明

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