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

📄 flatcombo.cpp

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

#include "stdafx.h"
#include "FlatCombo.h"

/////////////////////////////////////////////////////////////////////////////
// CFlatCombo 

CFlatCombo::CFlatCombo()
{
	// 临时画刷
	m_hbrList = NULL;
	m_hbrColor = NULL;
	m_hbrActive = NULL;
	
	// 是否有箭头
	m_bListArrow = TRUE;

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

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

	// 下拉框的颜色
	m_lbText = RGB(0, 0, 0);
	m_lbColor = RGB(255, 255, 255);

	// 控制变量
	m_bHotFlat = 2;
	m_bWndActive = FALSE;
	m_bMouseHover = FALSE;
}

CFlatCombo::~CFlatCombo() 
{
	if(m_hbrList != NULL) 
		DeleteObject(m_hbrList);

	if(m_hbrColor != NULL) 
		DeleteObject(m_hbrColor);

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


BEGIN_MESSAGE_MAP(CFlatCombo, CComboBox)
	//{{AFX_MSG_MAP(CFlatCombo)
	ON_WM_PAINT()
	ON_CONTROL_REFLECT(CBN_SETFOCUS, OnSetFocus)
	ON_CONTROL_REFLECT(CBN_KILLFOCUS, OnKillFocus)
	ON_WM_CTLCOLOR_REFLECT()
	ON_WM_MOUSEMOVE()
	ON_WM_CTLCOLOR()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFlatCombo message handlers

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

void CFlatCombo::PreSubclassWindow() 
{
	CComboBox::PreSubclassWindow();

	// Combo Edit Handle
	m_hComboEdit = ::GetWindow(m_hWnd, GW_CHILD);

	// 根据对话框确定
	RECT  rtRect = {0, 0, 0, 12};
	MapDialogRect(::GetParent(m_hWnd), &rtRect);

	// 设置控件的大小
	rtRect.bottom -= 6;
	SetItemHeight(-1, rtRect.bottom);
	SetItemHeight(0, rtRect.bottom + 3);
}

BOOL CFlatCombo::PreTranslateMessage(MSG * lpMsg) 
{
	if( lpMsg->hwnd == m_hComboEdit && 
		lpMsg->message == WM_MOUSEMOVE )
	{
		// 调用Timer,来跟踪Hover事件
		if(m_bHotFlat == 2 && !m_bMouseHover) 
		{
			SetTimer(0x0001, 50, NULL);
			m_bMouseHover = TRUE;
			Invalidate(TRUE);
		}
	}
	
	return CComboBox::PreTranslateMessage(lpMsg);
}

void CFlatCombo::OnSetFocus() 
{
	m_bWndActive = TRUE;
	Invalidate();

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

void CFlatCombo::OnKillFocus() 
{
	m_bMouseHover = FALSE;
	m_bWndActive = FALSE;
	KillTimer(0x0001);
	Invalidate();

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

HBRUSH CFlatCombo::CtlColor(CDC * lpDC, UINT nCtlColor)
{
	if( m_bWndActive || 
		(m_bHotFlat == 2 && m_bMouseHover) ) 
	{
		lpDC->SetTextColor(m_rgbDown);
		lpDC->SetBkColor(m_bkActive);

		// 创建临时画刷
		if(m_hbrActive == NULL) 
		   m_hbrActive = CreateSolidBrush(m_bkActive);
		return m_hbrActive;
	}

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

	// 创建临时画刷
	if(m_hbrColor == NULL) 
	   m_hbrColor = CreateSolidBrush(m_bkColor);
	return m_hbrColor;
}

HBRUSH CFlatCombo::OnCtlColor(CDC * lpDC, CWnd * lpWnd, UINT nCtlColor) 
{
	if(lpWnd->m_hWnd == m_hComboEdit) 
	{
		if( m_bWndActive || 
			(m_bHotFlat == 2 && m_bMouseHover) ) 
		{
			lpDC->SetTextColor(m_rgbDown);
			lpDC->SetBkColor(m_bkActive);

			// 创建临时画刷
			if(m_hbrActive == NULL) 
			   m_hbrActive = CreateSolidBrush(m_bkActive);
			return m_hbrActive;
		}

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

		// 创建临时画刷
		if(m_hbrColor == NULL) 
		   m_hbrColor = CreateSolidBrush(m_bkColor);
		return m_hbrColor;
	}

	// List Box 的颜色控制
	lpDC->SetTextColor(m_lbText);
	lpDC->SetBkMode(TRANSPARENT);

	if(m_hbrList == NULL) 
	   m_hbrList = CreateSolidBrush(m_lbColor);
	return m_hbrList;
}

void CFlatCombo::OnMouseMove(UINT nFlags, CPoint point) 
{
	CComboBox::OnMouseMove(nFlags, point);

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

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

	// 根据需要,画出扁平效果
	if( !m_bWndActive ) 
	{
		if( m_bHotFlat == 1 || 
		   (m_bHotFlat == 2 && !m_bMouseHover) )
		{
			CRect  rtRect;
			CWindowDC dc(this);
			GetWindowRect(&rtRect);

			// 注意,到EDIT的距离是3
			rtRect.bottom -= rtRect.top;
			rtRect.right -= rtRect.left;
			rtRect.left = rtRect.top = 0;
			COLORREF rgbLine = GetSysColor(COLOR_3DSHADOW);

			// 画出三根线条来
			dc.Draw3dRect(&rtRect, rgbLine, rgbLine); 
					rtRect.DeflateRect(1, 1);
			dc.Draw3dRect(&rtRect, m_bkColor, m_bkColor);
					rtRect.DeflateRect(1, 1);
			
			// 将按钮给覆盖掉
			rtRect.left = rtRect.right - 16;

			if( m_bListArrow ) 
			{
				if(GetItemHeight(0) < 16) 
				{
					// 箭头有点不对称
					dc.ScrollDC(0, -1, &rtRect, &rtRect, NULL, NULL);
				}

				COLORREF rgbFace = GetSysColor(COLOR_3DFACE);
				dc.Draw3dRect(&rtRect, rgbFace, rgbLine);
						rtRect.DeflateRect(1, 1);
				dc.Draw3dRect(&rtRect, rgbFace, rgbFace);
						rtRect.DeflateRect(1, 1);
				dc.Draw3dRect(&rtRect, rgbFace, rgbFace);
			}
			else 
			{
				// 将箭头部分填充掉				
				dc.FillSolidRect(&rtRect, m_bkColor);
			}

			return;
		}
	}

	// 标准箭头给纠正过来
	if(GetItemHeight(0) < 16) 
	{
		CRect  rtRect;
		GetWindowRect(&rtRect);
		rtRect.bottom -= rtRect.top;
		rtRect.right -= rtRect.left;
		rtRect.left = rtRect.top = 0;

		// 箭头有点不对称
		CWindowDC  dc(this);
		rtRect.DeflateRect(4, 4);
		rtRect.left = rtRect.right - 12;
		dc.ScrollDC(0, -1, &rtRect, &rtRect, NULL, NULL);
	}
}

void CFlatCombo::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);
		}
	}
}

int CFlatCombo::SearchParam(DWORD dwData) 
{
	long  nIdx = 0, nCount = GetCount();

	while(nIdx < nCount) 
	{
		if(GetItemData(nIdx) == dwData)
			return nIdx;

		nIdx ++;
	}

	// 没有选中
	return -1;
}

int CFlatCombo::SelectParam(DWORD dwData) 
{
	long  nIdx = 0, nCount = GetCount();

	while(nIdx < nCount) 
	{
		if(GetItemData(nIdx) == dwData)
		{
			SetCurSel(nIdx);
			return nIdx;
		}

		nIdx ++;
	}

	// 没有选中
	SetCurSel(-1);
	return -1;
}

⌨️ 快捷键说明

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