📄 renderbutton.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 + -