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

📄 flatcombobox.h

📁 一个使用wtl写的完整的多窗口浏览器
💻 H
字号:

#pragma once

#ifdef _DEBUG
	const bool _FlatComboBox_traceOn = false;
	#define fcbTRACE if (_FlatComboBox_traceOn) ATLTRACE
#else
	#define fcbTRACE
#endif

// The Web Browser style flat combo box control (light-flat combo box)
//
// Note. I can't find the way to avoid the thumb flicker while resizing.
//

class CFlatComboBox : public CWindowImpl<CFlatComboBox, CComboBox>,
	public CTrackMouseLeave<CFlatComboBox>
{
public:
// Constants
	enum { s_kcxyBorder = 2 };
	enum _ComboState { _comboNormal, _comboHot, _comboPressed };

// Data members
	_ComboState m_state;

// Ctor
	CFlatComboBox() : m_state(_comboNormal) { }

	bool FlatComboBox_Install(HWND hWndCombo)
	{
		MTLVERIFY( SubclassWindow(hWndCombo) );
//		MTLVERIFY( m_wndEdit.SubclassWindow(CComboBoxEx(GetParent()).GetEditCtrl()) );

		return true;
	}

	void FlatComboBox_Uninstall()
	{
		if (IsWindow())
			UnsubclassWindow();
	}

// Overrides

// Message map and handlers
	BEGIN_MSG_MAP(CFlatComboBox)
		MESSAGE_HANDLER(WM_PAINT, OnPaint)
		CHAIN_MSG_MAP(CTrackMouseLeave<CFlatComboBox>)
	END_MSG_MAP()

/*	LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		fcbTRACE(_T("OnSize\n"));
		bHandled = FALSE;

		CSize size(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));

		if (m_size != size) {
			m_bPassPaint = true;
			m_size = size;
		}

		return 1;
	}
*/
	LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		CRect rc;
		GetUpdateRect(&rc, FALSE);

		ValidateRect(NULL);// validate the whole

		// invaldate only the internal rect
		CRect rcCombo = _GetFlatComboInvalidateRect();
		CRect rcThumb = _GetFlatThumbInvalidateRect();

		CRect rcUpdate = rc & rcCombo;
		InvalidateRect(&rcUpdate, FALSE);
		rcUpdate = rc & rcThumb;
		InvalidateRect(&rcUpdate, FALSE);

//		CEdit edit = CComboBoxEx(GetParent()).GetEditCtrl();
//		ClientToScreen(&rcThumb);
//		edit.ScreenToClient(&rcThumb);
//		edit.ValidateRect(&rcThumb);
//	
		// update!
		LRESULT lRet = DefWindowProc();
//		if (lRet == 0) {
			CClientDC dc(m_hWnd);
			_DoComboPaint(dc.m_hDC);
//		}

		return lRet;
	}

	void _DoComboPaint(CDCHandle dc)
	{
		_DrawFlatCombo(dc, m_state);
		_DrawFlatThumb(dc);
	}

	void _DrawFlatThumb(CDCHandle& dc)
	{
		CRect rc = _GetOriginalThumbRect();
		dc.DrawEdge(rc, BDR_RAISEDINNER, BF_RECT);

		rc.DeflateRect(1, 1);
//		COLORREF clrBtnHilite = ::GetSysColor(COLOR_BTNHILIGHT);
//		dc.Draw3dRect(rc, clrBtnHilite, clrBtnHilite);

		COLORREF clrBtnFace = ::GetSysColor(COLOR_BTNFACE);
		dc.Draw3dRect(rc, clrBtnFace, clrBtnFace);
	}

	CRect _GetOriginalThumbRect()
	{
		CRect rc;
		GetClientRect(&rc);
		rc.right -= s_kcxyBorder;
		rc.left = rc.right - ::GetSystemMetrics(SM_CXHTHUMB);
		rc.top += s_kcxyBorder;
		rc.bottom -= s_kcxyBorder;
		return rc;
	}

	CRect _GetFlatThumbInvalidateRect()
	{
		CRect rc = _GetOriginalThumbRect();
		rc.DeflateRect(2, 2);
		return rc;
	}

	CRect _GetFlatComboInvalidateRect()
	{
		CRect rc;
		GetClientRect(&rc);
		rc.DeflateRect(2, 2);
		rc.right -= ::GetSystemMetrics(SM_CXHTHUMB);
		return rc;
	}

	void _DrawFlatCombo(CDCHandle& dc, _ComboState state)
	{
//		COLORREF clrBtnHilite = ::GetSysColor(COLOR_BTNHILIGHT);
//		COLORREF clrBtnShadow = ::GetSysColor(COLOR_BTNSHADOW);
		COLORREF clrBtnFace = ::GetSysColor(COLOR_BTNFACE);

		CRect rc;
		GetClientRect(&rc);

		dc.Draw3dRect(rc, clrBtnFace, clrBtnFace);
		rc.DeflateRect(1, 1);
		
		switch (state) {
		case _comboNormal:
		//	dc.Draw3dRect(rc, clrBtnFace, clrBtnFace);
			dc.DrawEdge(rc, BDR_SUNKENOUTER, BF_RECT);
			break;
		case _comboHot:
			dc.DrawEdge(rc, BDR_RAISEDINNER, BF_RECT);
			break;
		case _comboPressed:
//			rcItem.top -= 1;
//			rcItem.bottom += 1;
//			rcItem.OffsetRect(1,1);
//			dc.Draw3dRect(rcItem, clrBtnShadow, clrBtnHilite);
			break;
		}

	}
};

⌨️ 快捷键说明

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