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

📄 renderbutton.h

📁 vc编写的
💻 H
字号:
/*
 Copyright (c) 1999, kSet Lab 
 Author: Konstantin Bukreev 
 E-mail: konstantin@mail.primorye.ru 

 Created: 15.10.99 19:34:10
 Version: 1.0.0
*/

#ifndef _RenderButton_8c3fe02f_82ee_11d3_9285_0080adb811c5
#define _RenderButton_8c3fe02f_82ee_11d3_9285_0080adb811c5

#if _MSC_VER > 1000 
#pragma once
#endif // _MSC_VER > 1000

#include "GdiHelper.h"

template <class T>
class _Render
{
	enum {FOCUS_BORDER = 3};
	
	COLORREF m_clrBack;
	COLORREF m_clrShadow;
	COLORREF m_clrHighlight;
	COLORREF m_clrBorder;

public:

	void DrawIt(HDC hdc, int state, RECT& rc);

private:
	typedef void (_Render::*PTR_FDRAW)(_kDrawDC& dc, RECT& rc);

	static PTR_FDRAW& f_table (int appearance, int status)
	{
		//appearance, status 
		//static hover push disabled

		static PTR_FDRAW table[8][4] = 
		{			
			&_Render::draw_flat,             &_Render::draw_flat_hover,           &_Render::draw_flat_push,           &_Render::draw_flat, //flat
			&_Render::draw_border,           &_Render::draw_border_hover,         &_Render::draw_border_push,         &_Render::draw_border,  //border
			&_Render::draw_3d_border_up,     &_Render::draw_3d_border_up_hover,   &_Render::draw_3d_border_up_push,   &_Render::draw_3d_border_up,//3d border raised
			&_Render::draw_3d_border_down,   &_Render::draw_3d_border_down_hover, &_Render::draw_3d_border_down_push, &_Render::draw_3d_border_down,//3d border sunken
			&_Render::draw_3dlow_up,         &_Render::draw_3dlow_up,             &_Render::draw_3dlow_down,          &_Render::draw_3dlow_up, //3d low
			&_Render::draw_3dhigh_up,        &_Render::draw_3dhigh_up,            &_Render::draw_3dhigh_down,         &_Render::draw_3dhigh_up, //3d high			
			&_Render::draw_3dlow_up_border,  &_Render::draw_3dlow_up_border,      &_Render::draw_3dlow_down,          &_Render::draw_3dlow_up_border, //3d loww border
			&_Render::draw_3dhigh_up_border, &_Render::draw_3dhigh_up_border,     &_Render::draw_3dhigh_down,         &_Render::draw_3dhigh_up_border //3d high w border
		};

		ATLASSERT( appearance >= 0 && appearance <= 7 && status >= 0 && status <= 3);
		return table[appearance][status];	
	}

	void draw_flat (_kDrawDC& dc, RECT& rc)      
	{
		dc.FillSolidRect(&rc, m_clrBack);
	}	
	void draw_flat_push (_kDrawDC& dc, RECT& rc) 
	{
		T* pT = static_cast<T*>(this);
		if (pT->m_bShowStateAsFlat)
			dc.FillSolidRect(&rc, m_clrShadow);
		else
			dc.FillSolidRect(&rc, m_clrBack);
	}	
	void draw_flat_hover (_kDrawDC& dc, RECT& rc)
	{		
		T* pT = static_cast<T*>(this);
		if (pT->m_bShowStateAsFlat)
			dc.FillSolidRect(&rc, m_clrHighlight);
		else
			dc.FillSolidRect(&rc, m_clrBack);
	}	
	void draw_border(_kDrawDC& dc, RECT& rc) 
	{		
		dc.FillSolidRect(&rc, m_clrBack);
		dc.DrawBorder   (rc, m_clrBorder);	
	}	
	void draw_border_hover(_kDrawDC& dc, RECT& rc) 
	{	
		T* pT = static_cast<T*>(this);
		if (pT->m_bShowStateAsFlat)
			dc.FillSolidRect(&rc, m_clrHighlight);
		else
			dc.FillSolidRect(&rc, m_clrBack);
		dc.DrawBorder(rc, m_clrBorder);	
	}	
	void draw_border_push(_kDrawDC& dc, RECT& rc) 
	{		
		T* pT = static_cast<T*>(this);
		if (pT->m_bShowStateAsFlat)
			dc.FillSolidRect(&rc, m_clrShadow);
		else
			dc.FillSolidRect(&rc, m_clrBack);
		dc.DrawBorder (rc, m_clrBorder);	
	}	
	void draw_3d_border_up(_kDrawDC& dc, RECT& rc)
	{		
		dc.FillSolidRect(&rc, m_clrBack);
		dc.Draw3DBorder (rc,  m_clrShadow, true, m_clrHighlight);		
	}
	void draw_3d_border_up_hover(_kDrawDC& dc, RECT& rc)
	{	
		T* pT = static_cast<T*>(this);
		if (pT->m_bShowStateAsFlat)
			dc.FillSolidRect(&rc, m_clrHighlight);
		else
			dc.FillSolidRect(&rc, m_clrBack);		
		dc.Draw3DBorder (rc,  m_clrShadow, true, m_clrHighlight);		
	}
	void draw_3d_border_up_push(_kDrawDC& dc, RECT& rc)
	{		
		T* pT = static_cast<T*>(this);
		if (pT->m_bShowStateAsFlat)
			dc.FillSolidRect(&rc, m_clrShadow);
		else
			dc.FillSolidRect(&rc, m_clrBack);				
		dc.Draw3DBorder (rc,  m_clrShadow, true, m_clrHighlight);		
	}
	void draw_3d_border_down(_kDrawDC& dc, RECT& rc)
	{		
		dc.FillSolidRect(&rc, m_clrBack);
		dc.Draw3DBorder(rc,   m_clrShadow, false, m_clrHighlight);
	}
	void draw_3d_border_down_hover(_kDrawDC& dc, RECT& rc)
	{		
		T* pT = static_cast<T*>(this);
		if (pT->m_bShowStateAsFlat)
			dc.FillSolidRect(&rc, m_clrHighlight);
		else
			dc.FillSolidRect(&rc, m_clrBack);		
		dc.Draw3DBorder (rc,  m_clrShadow, false, m_clrHighlight);
	}
	void draw_3d_border_down_push(_kDrawDC& dc, RECT& rc)
	{		
		T* pT = static_cast<T*>(this);
		if (pT->m_bShowStateAsFlat)
			dc.FillSolidRect(&rc, m_clrShadow);
		else
			dc.FillSolidRect(&rc, m_clrBack);				
		dc.Draw3DBorder (rc, m_clrShadow, false, m_clrHighlight);
	}
	void draw_3dlow_up(_kDrawDC& dc, RECT& rc)
	{		
		dc.DrawLowButton(rc, m_clrBack, m_clrHighlight, m_clrShadow, true, false);
	}
	void draw_3dlow_down(_kDrawDC& dc, RECT& rc)
	{		
		dc.DrawLowButton(rc, m_clrBack, m_clrHighlight, m_clrShadow, false, false);
	}
	void draw_3dhigh_up(_kDrawDC& dc, RECT& rc)
	{		
		dc.DrawHighButton(rc, m_clrBack, m_clrHighlight, m_clrShadow, true, false);		
	}
	void draw_3dhigh_down(_kDrawDC& dc, RECT& rc)
	{		
		dc.DrawHighButton(rc, m_clrBack, m_clrHighlight, m_clrShadow, false, false);
	}
	void draw_3dlow_up_border(_kDrawDC& dc, RECT& rc)
	{		
		dc.DrawLowButton(rc, m_clrBack, m_clrHighlight, m_clrShadow, true, true, m_clrBorder);
	}
	void draw_3dhigh_up_border(_kDrawDC& dc, RECT& rc)
	{		
		dc.DrawHighButton(rc, m_clrBack, m_clrHighlight, m_clrShadow, true, true, m_clrBorder);		
	}	
	COLORREF Convert (OLE_COLOR oleClr)
	{
		T* pT = static_cast<T*>(this);
		COLORREF clr = 0;
		OleTranslateColor(oleClr, pT->m_hPal, &clr);
		return clr;
	}
};

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

template <class T>
void _Render<T>::DrawIt(HDC hdc, int state, RECT& rc)
{
	USES_CONVERSION;

	CComPtr<IFontDisp> pFont;
	CComPtr<IPictureDisp> pPictureDisp;
	COLORREF clrText = 0;
	int modx = 0; int mody = 0;
	PTR_FDRAW ff = 0;
	TCHAR* pTxt = 0;
	unsigned int len = 0;

	T* pT = static_cast<T*>(this);

	switch (state)
	{
	case 0:
		ff = f_table(pT->m_AppearanceStatic, state);
		clrText = Convert(pT->m_clrTextStaticColor);
		pPictureDisp = pT->m_pPictureStatic;
		pFont    = pT->m_pFontStatic; 
		pTxt = W2T(pT->m_bstrTextStatic);
		len = pT->m_bstrTextStatic.Length();
		break;
	case 1:
		ff = f_table(pT->m_AppearanceHover, state);
		clrText = Convert(pT->m_clrTextHoverColor);
		pPictureDisp = pT->m_pPictureHover;
		pFont   = pT->m_pFontHover; 
		pTxt = W2T(pT->m_bstrTextHover);
		len = pT->m_bstrTextHover.Length();
		break;
	case 2:
		ff = f_table(pT->m_AppearancePush, state);
		clrText = Convert(pT->m_clrTextPushColor);
		pPictureDisp = pT->m_pPicturePush;
		pFont   = pT->m_pFontPush; 
		if ((pT->m_AppearanceHover == k3dLow) || 
			(pT->m_AppearanceHover == k3dHigh) ||
			(pT->m_AppearanceHover == k3dLowWithBorder) ||
			(pT->m_AppearanceHover == k3dHighWithBorder))
		{
			modx = mody = 1;			
		}
		pTxt = W2T(pT->m_bstrTextPush);
		len = pT->m_bstrTextPush.Length();
		break;
	case 3:
		ff = f_table(pT->m_AppearanceStatic, state);
		clrText = Convert(pT->m_clrShadowColor);
		pPictureDisp = pT->m_pPictureDisabled ? pT->m_pPictureDisabled : pT->m_pPictureStatic;
		pFont = pT->m_pFontStatic; 
		pTxt = W2T(pT->m_bstrTextStatic);
		len = pT->m_bstrTextStatic.Length();
		break;
	default:
		ATLASSERT(0);
	};

	m_clrBack      = Convert(pT->m_clrBackColor);
	m_clrShadow    = Convert(pT->m_clrShadowColor);
	m_clrHighlight = Convert(pT->m_clrHighlightColor);
	m_clrBorder    = Convert(pT->m_clrBorderColor);

	//draw button
	{
		_kDrawDC dc(hdc);
		(this->*ff)(dc, rc);			
	}
		
	//calculation of coord.
	SIZE szTxt, crTxt, szPic, crPic, szPicHM;

	int height = rc.bottom - rc.top;
	int width  = rc.right - rc.left;
		
	_kOleFont _font(pFont);
	_kAutoSelect<HFONT> _auto(hdc, _font);
	
	GetTextExtentPoint32(hdc, pTxt, len, &szTxt);

	if (pT->m_AccelSymbol && (state == 0 || state == 3))
	{
		SIZE szAmp;
		GetTextExtentPoint32(hdc, _T("&"), 1, &szAmp);
		szTxt.cx -= szAmp.cx;
	}	

	CComQIPtr<IPicture> pPic(pPictureDisp);
	if (pPic)
	{
		pPic->get_Width (&szPicHM.cx);
		pPic->get_Height(&szPicHM.cy);				
		AtlHiMetricToPixel(&szPicHM, &szPic);
	
		int x = max(rc.left, (rc.left + (width - szTxt.cx - szPic.cx - pT->m_sPictureSpacing) / 2));
		int y = max(rc.top, (rc.top + (height - szTxt.cy - szPic.cy - pT->m_sPictureSpacing) / 2));
		switch (pT->m_Alignment)
		{
			case 0: //left 
				crPic.cx = x; crTxt.cx = x + pT->m_sPictureSpacing + szPic.cx;						
				crPic.cy = max(rc.top, (rc.top +  (height - szPic.cy) / 2));
				crTxt.cy = max(rc.top, (rc.top +  (height - szTxt.cy) / 2));
				break; 
			case 1: //center
				crPic.cy = max(rc.top, (rc.top +  (height - szPic.cy) / 2));
				crTxt.cy = max(rc.top, (rc.top +  (height - szTxt.cy) / 2));
				crPic.cx = max(rc.left, (rc.left + (width - szPic.cx) / 2));
				crTxt.cx = max(rc.left, (rc.left + (width - szTxt.cx) / 2));
				break;
			case 2: //right
				crTxt.cx = x; crPic.cx = x + pT->m_sPictureSpacing + szTxt.cx;						
				crPic.cy = max(rc.top, (rc.top +  (height - szPic.cy) / 2));
				crTxt.cy = max(rc.top, (rc.top +  (height - szTxt.cy) / 2));			
				break;
			case 3: //top				
				if (state != 3)
				{
					crTxt.cy = y + pT->m_sPictureSpacing + szPic.cy; 
					crPic.cy = y + pT->m_sPictureSpacing + szTxt.cy;
				}
				else
				{
					crPic.cy = y; 	crTxt.cy = y + pT->m_sPictureSpacing + szPic.cy;
				}
				crPic.cx = max(rc.left, (rc.left + (width - szPic.cx) / 2));
				crTxt.cx = max(rc.left, (rc.left + (width - szTxt.cx) / 2));
				break;
			case 4: 	//bottom	
				if (state != 3)
				{
					crTxt.cy = y; crPic.cy = y; 
				}
				else
				{
					crTxt.cy = y; 	crPic.cy = y + pT->m_sPictureSpacing + szTxt.cy;
				}
				crPic.cx = max(rc.left, (rc.left + (width - szPic.cx) / 2));
				crTxt.cx = max(rc.left, (rc.left + (width - szTxt.cx) / 2));
				break;
			default: 
				ATLASSERT(0); 
				break;
			}
		}
	else
	{		
		crTxt.cy = max(rc.top,  (rc.top +  (height - szTxt.cy) / 2));
		crTxt.cx = max(rc.left, (rc.left + (width  - szTxt.cx) / 2));
		szTxt.cx = min(width , szTxt.cx);
		szTxt.cy = min(height, szTxt.cy);
	}

	//draw text

	SetBkMode(hdc, TRANSPARENT); 					

	crTxt.cx += modx; crTxt.cy += mody; 
	crPic.cx += modx; crPic.cy -= mody;

	if (state == 3)
	{
		SetTextColor(hdc, m_clrHighlight); 		
		DrawState(hdc, 0, 0, (LPARAM)pTxt, len, crTxt.cx + 1, crTxt.cy + 1, 0, 0, DST_PREFIXTEXT); 
	}
		
	SetTextColor(hdc, clrText); 	
	DrawState(hdc, 0, 0, (LPARAM)pTxt, len, crTxt.cx, crTxt.cy, 0, 0, DST_PREFIXTEXT); 

	//draw focus
	if ((pT->m_ShowFocus == kDrawRect) && pT->m_bFocused)
	{
		RECT rc_focus = {rc.left + FOCUS_BORDER + modx, rc.top + FOCUS_BORDER + mody, rc.right - FOCUS_BORDER, rc.bottom - FOCUS_BORDER};
		//SetBkColor(hdc, m_clrShadow); 
		SetBkColor(hdc, m_clrBack);		
		DrawFocusRect(hdc, &rc_focus); 
	}

	//draw picture
	if (pPic)
	{
		if (state != 3)
		{
			int id = SaveDC(hdc); 

			SetMapMode(hdc, MM_ISOTROPIC);
			SetWindowExtEx(hdc, rc.right, rc.bottom, 0);
			SetViewportExtEx(hdc, rc.right, -rc.bottom, 0);
			SetViewportOrgEx(hdc, 0, (rc.bottom - rc.top), 0);
			pPic->Render(hdc, crPic.cx, crPic.cy, szPic.cx, szPic.cy, 0, 20, szPicHM.cx, szPicHM.cy, 0); 	

			RestoreDC(hdc, id); 				
		}
		else
		{
			OLE_HANDLE h = 0; 
			unsigned int flag = 0; 
			short type = 0;

			pPic->get_Handle(&h);			
			pPic->get_Type(&type);
				
			if (type == PICTYPE_BITMAP)
				flag = DST_BITMAP;
			else if (type == PICTYPE_ICON)
				flag = DST_ICON;

			if (flag)
			{
				_kBrush hbr1(m_clrShadow);
				_kBrush hbr2(m_clrHighlight);
			
				DrawState(hdc, hbr2, 0, (LPARAM)h, 0, crPic.cx + 1, crPic.cy + 1, szPic.cx, szPic.cy, flag | DSS_MONO);
				DrawState(hdc, hbr1, 0, (LPARAM)h, 0, crPic.cx, crPic.cy, szPic.cx, szPic.cy, flag  | DSS_MONO);		
			}
		}
	}
}

#endif //_RenderButton_8c3fe02f_82ee_11d3_9285_0080adb811c5

⌨️ 快捷键说明

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