Skip to content

WTL自定义的常用类

Published: at 04:22 AM | 5 min read

设置背景图片


#ifndef __BITMAPBKGND_H__
#define __BITMAPBKGND_H__
template <class T, UINT uBitmapID>
class CBitmapBkgnd : public CMessageMap
{
public:
	CBitmapBkgnd() { m_Bitmap.LoadBitmap(uBitmapID); }
	~CBitmapBkgnd() { m_Bitmap.DeleteObject(); }
	BEGIN_MSG_MAP(CPaintBkgnd)
		MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
	END_MSG_MAP()
 
	LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		T*   pT = static_cast<T*>(this);
		HDC  hDC = (HDC) wParam;
		RECT rcClient;
		pT->GetClientRect ( &rcClient );
		
		BITMAP bm;
		m_Bitmap.GetBitmap(&bm);
		CDC memDC;
		memDC.CreateCompatibleDC(hDC);
		HBITMAP hOldBmp = memDC.SelectBitmap(m_Bitmap);
		StretchBlt(hDC,0,0,rcClient.right - rcClient.left,rcClient.bottom - rcClient.top,memDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
		memDC.SelectBitmap(hOldBmp);
		memDC.DeleteDC();
		return 1;    // we painted the background
	}
protected:
	CBitmap m_Bitmap;
};
#endif //__BITMAPBKGND_H__
用法:
1.包含类的头文件;
2.让对话框类公有继承:public CBitmapBkgnd<CMainDlg, IDB_MAIN_BKGND>;
3.在消息映射之前:typedef CBitmapBkgnd<CMainDlg,IDB_MAIN_BKGND> CBmpBkgndBase;
4.在消息映射内:CHAIN_MSG_MAP(CBmpBkgndBase)

设置背景颜色以及字体颜色


#ifndef __CTRLCOLOR_H__
#define __CTRLCOLOR_H__
template <class T, COLORREF t_crTextColor = RGB(0, 0, 0), COLORREF t_crBkgnd = RGB(255,255,255)>
class CCtrlColor
{
public:
	CCtrlColor() { m_brBkgnd = CreateSolidBrush(t_crBkgnd);}
	~CCtrlColor() { DeleteObject(m_brBkgnd);}
 
	BEGIN_MSG_MAP(CCtrlColor)
		MESSAGE_HANDLER(WM_CTLCOLORDLG, OnCtlColor)
		MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnCtlColor)
	END_MSG_MAP()
	LRESULT OnCtlColor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		HDC hDC = (HDC)wParam;
		HWND hWnd = (HWND)lParam;
		if(uMsg == WM_CTLCOLORDLG)
		{
			bHandled = TRUE;
			return (LRESULT)m_brBkgnd;
		}
		else if(uMsg == WM_CTLCOLORSTATIC)
		{	
			SetBkMode(hDC,TRANSPARENT);
			SetTextColor(hDC,t_crTextColor);
			
			bHandled = TRUE;
			return (LRESULT)m_brBkgnd;
		}
		else
			return 0;
	}
 
protected:
	HBRUSH m_brBkgnd;
};
#endif //__CTRLCOLOR_H__

自定义静态文本控件


#ifndef _MYSTATIC_H_
#define _MYSTATIC_H_
template<class T, class TBase = CStatic, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CMyStatic : public CWindowImpl<T, TBase, TWinTraits>
{
public:
	typedef CMyStatic<T, TBase, TWinTraits> thisClass;
	COLORREF m_clrText;
	COLORREF m_bkColor;
	COLORREF m_clrLine;
	BOOL m_bHorizontal;
	BOOL m_bActive;
	BOOL m_bUnderLine;
	CFont m_font;
	CBitmap m_bmp;
	CMyStatic(void) :
		m_clrText(RGB(104, 115, 122)),
		m_bkColor(RGB(255, 255, 255)),
		m_clrLine(RGB(104, 115, 122)),
		m_bActive(FALSE),
		m_bHorizontal(FALSE),
		m_bUnderLine(FALSE){ }
	~CMyStatic(void){ }
	BOOL SubclassWindow(HWND hwnd)
	{
		ATLASSERT(m_hWnd == NULL);
		ATLASSERT(::IsWindow(hwnd));
		BOOL bRet = CWindowImpl<T, TBase>::SubclassWindow(hwnd);
		if (bRet)
		{
			InitMyStatic();
		}
		return bRet;
	}
	void SetTextColor(COLORREF clrText)
	{
		m_clrText = clrText;
		if (IsWindow())
		{
			Invalidate();
		}
	}
	void SetLabelBkColor(COLORREF clrBk)
	{
		m_bkColor = clrBk;
		if (IsWindow())
		{
			Invalidate();
		}
	}
	void SetActive(BOOL bActive = FALSE)
	{
		m_bActive = bActive;
		if (IsWindow())
		{
			Invalidate();
		}
	}
	void SetHorizontalFill(BOOL bHoriz = FALSE)
	{
		m_bHorizontal = bHoriz;
		if (IsWindow())
		{
			Invalidate();
		}
	}
	void SetUnderLine(COLORREF clrLine, BOOL bUnderLine = FALSE)
	{
		m_clrLine = clrLine;
		m_bUnderLine = bUnderLine;
		if (IsWindow())
		{
			Invalidate();
		}
	}
	
	void InitMyStatic()
	{
		ATLASSERT(::IsWindow(m_hWnd));
		TCHAR lpszBuffer[10] = { 0 };
		if( ::GetClassName(m_hWnd, lpszBuffer, 9) )
		{
			if( ::lstrcmpi(lpszBuffer, TBase::GetWndClassName()) == 0 )
			{
				ModifyStyle(0, SS_NOTIFY);  // We need this
				DWORD dwStyle = GetStyle() & 0x000000FF;
				if( dwStyle == SS_ICON || dwStyle == SS_BLACKRECT || dwStyle == SS_GRAYRECT ||
                dwStyle == SS_WHITERECT || dwStyle == SS_BLACKFRAME || dwStyle == SS_GRAYFRAME ||
                dwStyle == SS_WHITEFRAME || dwStyle == SS_OWNERDRAW ||
                dwStyle == SS_BITMAP || dwStyle == SS_ENHMETAFILE )
				{
				ATLASSERT("Invalid static style for gradient label"==NULL);
				}
			}
		}
		CWindow wnd = GetParent();
		CFontHandle font = wnd.GetFont();
		if (!font.IsNull())
		{
			LOGFONT lf;
			font.GetLogFont(&lf);
			lf.lfWeight = FW_BOLD;
			//lf.lfUnderline = TRUE;
			m_font.CreateFontIndirect(&lf);
			SetFont(m_font);
		}
	}
	BEGIN_MSG_MAP(thisClass)
		MESSAGE_HANDLER(WM_CREATE, OnCreate)
		MESSAGE_HANDLER(WM_PAINT, OnPaint)
		MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
		MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
		MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor)
		MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
		MESSAGE_HANDLER(WM_MOUSEHOVER, OnMouseHover)
		MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)
		DEFAULT_REFLECTION_HANDLER()
	END_MSG_MAP()
	LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		InitMyStatic();
		return 0;
	}
	LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
      return 1;
	}
	LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		HCURSOR hcur = LoadCursor(NULL, IDC_HAND);
		::SetCursor(hcur);
		return 0;
	}
	LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		T* pt = static_cast<T*>(this);
		if (wParam != NULL)
		{
			pt->DoPaint((HDC)wParam);
		}
		else
		{
			CPaintDC dc(m_hWnd);
			pt->DoPaint((HDC)dc);
		}
		return 0;
	}
	LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& hHandled)
	{
		int xPos = LOWORD(lParam);
		int yPos = HIWORD(lParam);
		TRACKMOUSEEVENT tme;
		tme.cbSize = sizeof(tme);
		tme.hwndTrack = m_hWnd;
		tme.dwFlags = TME_LEAVE | TME_HOVER;
		tme.dwHoverTime = 1;
		_TrackMouseEvent(&tme);
		
		return 0;
	}
	LRESULT OnMouseHover(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& hHandled)
	{
		SetUnderLine(RGB(104, 115, 122), TRUE);
		return 0;
	}
	LRESULT OnMouseLeave(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& hHandled)
	{
		SetUnderLine(RGB(255, 255, 255), TRUE);
		return 0;
	}
	void DoPaint(CDCHandle dc)
	{
		int nTextLeft;
		int nTextBottom;
		TEXTMETRIC tm;
		CPen underLinePen, oldLinePen;
		HPEN hLinePen;
		RECT rcClient;
		GetClientRect(&rcClient);
		if (m_bActive)
		{
			DoBkFill(dc, rcClient);
		}
		dc.GetTextMetricsW(&tm);
		dc.SetBkMode(TRANSPARENT);
		dc.SetTextColor(m_clrText == CLR_INVALID ? ::GetSysColor(COLOR_CAPTIONTEXT) : m_clrText);
		HFONT hOldFont = dc.SelectFont(GetFont());
		int nLen = GetWindowTextLength();
		if (nLen > 0)
		{
			LPTSTR lpszText = (LPTSTR)_alloca((nLen + 1) * sizeof(TCHAR));
			if (GetWindowText(lpszText, nLen + 1))
			{
				DWORD dwStyle = GetStyle();
				int nDrawStyle = DT_LEFT;
				if (dwStyle & SS_CENTER)
				{
					nDrawStyle = DT_CENTER;
				}
				else if (dwStyle & SS_RIGHT)
				{
					nDrawStyle = DT_RIGHT;
				}
				if( dwStyle & SS_SIMPLE)
				{
					nDrawStyle = DT_VCENTER | DT_SINGLELINE;
				}
				
				dc.DrawText(lpszText, -1, &rcClient, nDrawStyle | DT_WORDBREAK);
			}
		}
		dc.SelectFont(hOldFont);
		if (m_bUnderLine)
		{
			//SetMyFont();
			nTextLeft = rcClient.left - 2;
			nTextBottom = rcClient.bottom - 3;
			hLinePen = underLinePen.CreatePen(PS_SOLID, 1, m_clrLine);
			oldLinePen = dc.SelectPen(hLinePen);
			dc.MoveTo(nTextLeft, nTextBottom);
			dc.LineTo(nTextLeft + tm.tmAveCharWidth * nLen * 2, nTextBottom);
			dc.SelectPen(oldLinePen);
		}
	}
	void DoBkFill(CDCHandle& dc, const RECT& rc)
	{
		int nShift = 6;
		int nSteps = 1 << nShift;
		//for (int i = 0; i < nSteps; i++)
		//{
		//	CBrush br;
		//	br.CreateSolidBrush(m_bkColor);
		//	RECT r2 = rc;
		//	if (m_bHorizontal)
		//	{
		//		r2.bottom =rc.bottom - ((i * (rc.bottom - rc.top)) >> nShift);
		//		r2.top = rc.bottom - (((i + 1) * (rc.bottom - rc.top)) >> nShift);
		//		if ((r2.bottom - r2.top) > 0)
		//		{
		//			dc.FillRect(&r2, br);
		//		}
		//	}
		//	else
		//	{
		//		r2.left = rc.left + ((i * (rc.right - rc.left)) >> nShift);
		//		r2.right = rc.left + (((i + 1) * (rc.right - rc.left)) >> nShift);
		//		if ((r2.right - r2.left) > 0)
		//		{
		//			dc.FillRect(&r2, br);
		//		}
		//	}
		//}
		//BITMAP bm;
		//m_bmp.LoadBitmap(IDB_BITMAP1);
		//m_bmp.GetBitmap(&bm);
		//CDC memDC;
		//memDC.CreateCompatibleDC(dc);
		//HBITMAP hOldBmp = memDC.SelectBitmap(m_bmp);
		//dc.BitBlt(0, 0, rc.right - rc.left, rc.bottom - rc.top, memDC, 0, 0, SRCCOPY);
		//memDC.SelectBitmap(hOldBmp);
		//memDC.DeleteDC();
	}
};
class CCoolLabel : public CMyStatic<CCoolLabel>
{
public:
	DECLARE_WND_CLASS(L"WTL_CoolLabel");
};
#endif //_MYSTATIC_H_

2011-05-08