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

📄 flatedit.cpp

📁 对c++中的各种ui对象进行封装
💻 CPP
字号:
// CFlatEdit.cpp : implementation file
////////////////////////////////////////////////

#include "stdafx.h"
#include "FlatEdit.h"

/////////////////////////////////////////////////////////////////////////////

CFlatEdit::CFlatEdit()
{
	// 失去焦点时扁平
	m_bHotFlat = 2;
	m_bMouseHover = FALSE;

	// 文字颜色
	m_rgbDown = RGB(0, 0, 255);
	m_rgbText = RGB(0, 0, 0);

	// 背景颜色
	m_bkColor = RGB(255, 255, 255);
	m_bkActive = RGB(255, 255, 255);

	// 画笔句柄
	m_hbrColor = NULL;
	m_hbrActive = NULL;

	// 最大输入个数
	m_nMaxSize = -1;
}

CFlatEdit::~CFlatEdit()
{
	if(m_hbrColor != NULL) 
		DeleteObject(m_hbrColor);

	if(m_hbrActive != NULL) 
		DeleteObject(m_hbrActive);
}


BEGIN_MESSAGE_MAP(CFlatEdit, CEdit) 
	//{{AFX_MSG_MAP(CFlatEdit)
	ON_WM_CTLCOLOR_REFLECT()
	ON_WM_PAINT()
	ON_WM_MOUSEMOVE()
	ON_WM_SETFOCUS()
	ON_WM_KILLFOCUS()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CFlatEdit message handlers

// 象控件一样创建
BOOL CFlatEdit::Create(DWORD dwStyle, const RECT& rect, 
			 CWnd * lpParent, UINT nWndID, DWORD dwExStyle) 
{
	long  cx = rect.right - rect.left;
	long  cy = rect.bottom - rect.top;
	HWND  hWnd = CreateWindowEx(dwExStyle, 
			"EDIT", NULL, dwStyle, rect.left, 
			rect.top, cx, cy, lpParent->GetSafeHwnd(), 
			(HMENU)nWndID, AfxGetInstanceHandle(), NULL);
	if(hWnd == NULL)  return FALSE;
	return SubclassWindow(hWnd);
}

void CFlatEdit::PreSubclassWindow() 
{
	CEdit::PreSubclassWindow();

	// 设置最大输入个数
	if(m_nMaxSize > 0)  SetLimitText(m_nMaxSize);
}

HBRUSH CFlatEdit::CtlColor(CDC * lpDC, UINT nCtlColor) 
{
	if( ::GetFocus() == m_hWnd || 
		(m_bHotFlat == 2 && m_bMouseHover) ) 
	{
		if(m_hbrActive == NULL) 
		   m_hbrActive = CreateSolidBrush(m_bkActive);

		lpDC->SetTextColor(m_rgbDown);
		lpDC->SetBkColor(m_bkActive);
		return m_hbrActive;
	}

	if(m_hbrColor == NULL) 
	   m_hbrColor = CreateSolidBrush(m_bkColor);

	// 一般背景颜色
	lpDC->SetTextColor(m_rgbText);
	lpDC->SetBkColor(m_bkColor);
	return m_hbrColor;
}

void CFlatEdit::OnPaint() 
{
	// 调用默认的函数
	Default();

	// 画出 Flat 样式
	if( m_bHotFlat == 3 || 
		::GetFocus() != m_hWnd ) 
	{
		if( (m_bHotFlat == 2 && !m_bMouseHover) || 
			m_bHotFlat == 3 || m_bHotFlat == 1 ) 
		{
			// 边界样式
			CRect  rtFrame;
			GetWindowRect(&rtFrame);
			rtFrame.bottom -= rtFrame.top;
			rtFrame.right -= rtFrame.left;
			rtFrame.left = rtFrame.top = 0;  

			// 画出边界来
			CWindowDC  dc(this);
			COLORREF rgbPen = GetSysColor(COLOR_3DSHADOW);
			dc.Draw3dRect(&rtFrame, rgbPen, rgbPen);

			// 去掉其它边界
			long   nCount = 0;
			DWORD  dwStyle = GetExStyle();
			if(dwStyle & WS_EX_CLIENTEDGE)  nCount += 2;
			if(dwStyle & WS_EX_STATICEDGE)  nCount += 2;
			if(dwStyle & WS_EX_DLGMODALFRAME) 
			{
				if(dwStyle & WS_EX_STATICEDGE) 
					nCount ++;
				else  nCount += 3;
			}

			for(nCount --; nCount > 0; nCount --) 
			{
				rtFrame.DeflateRect(1, 1);
				dc.Draw3dRect(&rtFrame, m_bkColor, m_bkColor);
			}

			// DrawFlat 返回
			return;
		}
	}

	// 恢复原来的边界
	SendMessage(WM_NCPAINT, 0x0001);
}

void CFlatEdit::OnSetFocus(CWnd* pOldWnd) 
{
	CEdit::OnSetFocus(pOldWnd);
	Invalidate(TRUE);

	// 发送一个消息到父窗口
	GetParent()->SendMessage(WM_EDIT_FOCUS, 
		TRUE, GetDlgCtrlID() );
}

void CFlatEdit::OnKillFocus(CWnd* pNewWnd) 
{
	CEdit::OnKillFocus(pNewWnd);
	Invalidate(TRUE);

	// 发送一个消息到父窗口
	GetParent()->SendMessage(WM_EDIT_FOCUS, 
		FALSE, GetDlgCtrlID() );
}

void CFlatEdit::OnMouseMove(UINT nFlags, CPoint point) 
{
	// 默认的函数还是调用
	CEdit::OnMouseMove(nFlags, point);

	// 调用Timer,来跟踪Hover事件
	if( !m_bMouseHover ) 
	{
		SetTimer(0x0001, 50, NULL);
		m_bMouseHover = TRUE;
		Invalidate(TRUE);
	}
}

void CFlatEdit::OnTimer(UINT nIDEvent) 
{
	if( m_bMouseHover ) 
	{
		POINT  myPos;
		GetCursorPos(&myPos);

		RECT  rtRect;
		GetWindowRect(&rtRect);

		if( !PtInRect(&rtRect, myPos) ) 
		{
			KillTimer(0x0001);
			m_bMouseHover = FALSE;
			Invalidate(TRUE);
		}
	}
}

⌨️ 快捷键说明

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