📄 calendar_btn.cpp
字号:
dc_shadow.FillRect(&irClient, pbrBtnBackground);
switch(m_iBehaviour)
{
case eBE_Static:
{
// Show as raised.
dc_shadow.Draw3dRect(
&irClient,
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Raised_LeftTop),
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Raised_RightBottom));
break;
}
case eBE_Push:
{
if(m_bIsPressed)
{
// Show as sunken.
dc_shadow.Draw3dRect(
&irClient,
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Pressed_LeftTop),
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Pressed_RightBottom));
}
else
{
if(m_iStyle == eS_Flat)
{
if(m_bIsHovered)
{
// Show as raised.
dc_shadow.Draw3dRect(
&irClient,
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Raised_LeftTop),
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Raised_RightBottom));
}
else
{
// Show as neutral (sleeping).
dc_shadow.Draw3dRect(
&irClient,
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Sleeping_LeftTop),
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Sleeping_RightBottom));
}
}
else
{
// Show as raised.
dc_shadow.Draw3dRect(
&irClient,
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Raised_LeftTop),
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Raised_RightBottom));
}
}
break;
}
case eBE_Radio:
{
if(m_bIsPressed)
{
m_iState = eST_Down;
}
if(m_iStyle == eS_Flat)
{
if(m_iState == eST_Down)
{
// Show as sunken.
dc_shadow.Draw3dRect(
&irClient,
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Pressed_LeftTop),
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Pressed_RightBottom));
}
else
{
if(m_bIsHovered)
{
// Show as raised.
dc_shadow.Draw3dRect(
&irClient,
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Raised_LeftTop),
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Raised_RightBottom));
}
else
{
// Show as neutral (sleeping).
dc_shadow.Draw3dRect(
&irClient,
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Sleeping_LeftTop),
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Sleeping_RightBottom));
}
}
}
else
{
if(m_iState == eST_Down)
{
// Show as sunken.
dc_shadow.Draw3dRect(
&irClient,
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Pressed_LeftTop),
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Pressed_RightBottom));
}
else
{
// Show as raised.
dc_shadow.Draw3dRect(
&irClient,
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Raised_LeftTop),
((m_iState == eST_Disabled) ? m_crBtn_Externals_Disabled : m_crBtn_Externals_Raised_RightBottom));
}
}
break;
}
}
}
const void CCalBtn::Draw_Button_Internals(
CShadowDC &dc_shadow,
const CRectEx &irClient)
// Draw inside of btn.
{
// Assume button is wide.
const CSizeEx isArrow(8, max(irClient.Height() - 6, 3));
const CSizeEx isBox(min(13, irClient.Width()), min(13, irClient.Height()));
CRectEx irDeco;
const CSizeEx isPressed(
(m_bIsPressed ? 1 : 0),
(m_bIsPressed ? 1 : 0));
switch(m_iType)
{
// Box.
case eT_Box:
{
irDeco.SetWH(
irClient.left + (irClient.Width() - isBox.cx) / 2 + isPressed.cx,
irClient.top + (irClient.Height() - isBox.cy) / 2 + isPressed.cy,
isBox.cx,
isBox.cy);
Draw_Box(dc_shadow, irDeco);
break;
}
// Normal btn.
case eT_Text:
{
Draw_Button_Text(dc_shadow, irClient);
break;
}
// 1 arrow.
case eT_1Arrow_North: // No impl.
{
break;
}
case eT_1Arrow_East:
{
irDeco.SetWH(
irClient.left + (irClient.Width() - isArrow.cx) / 2 + isPressed.cx,
irClient.top + (irClient.Height() - isArrow.cy) / 2 + isPressed.cy,
isArrow.cx,
isArrow.cy);
irDeco.OffsetRect(1, 0);
Draw_ArrowHead(dc_shadow, irDeco, eAE_East);
break;
}
case eT_1Arrow_South: // No impl.
{
break;
}
case eT_1Arrow_West:
{
irDeco.SetWH(
irClient.left + (irClient.Width() - isArrow.cx) / 2 + isPressed.cx,
irClient.top + (irClient.Height() - isArrow.cy) / 2 + isPressed.cy,
isArrow.cx,
isArrow.cy);
irDeco.OffsetRect(-1, 0);
Draw_ArrowHead(dc_shadow, irDeco, eAE_West);
break;
}
case eT_2Arrow_North: // No impl.
{
return;
}
// 2 arrows.
case eT_2Arrow_East:
{
irDeco.SetWH(
irClient.left + (irClient.Width() - 2 * isArrow.cx) / 2 + isPressed.cx,
irClient.top + (irClient.Height() - isArrow.cy) / 2 + isPressed.cy,
isArrow.cx,
isArrow.cy);
Draw_ArrowHead(dc_shadow, irDeco, eAE_East);
irDeco.OffsetRect(isArrow.cx, 0);
Draw_ArrowHead(dc_shadow, irDeco, eAE_East);
break;
}
case eT_2Arrow_South: // No impl.
{
return;
}
case eT_2Arrow_West:
{
irDeco.SetWH(
irClient.left + (irClient.Width() - 2 * isArrow.cx) / 2 + isPressed.cx,
irClient.top + (irClient.Height() - isArrow.cy) / 2 + isPressed.cy,
isArrow.cx,
isArrow.cy);
Draw_ArrowHead(dc_shadow, irDeco, eAE_West);
irDeco.OffsetRect(isArrow.cx, 0);
Draw_ArrowHead(dc_shadow, irDeco, eAE_West);
break;
}
}
switch(m_iCheckState)
{
case I_MF_CHECKED:
{
Draw_Checkmark(dc_shadow, irClient);
break;
}
case I_MF_UNCHECKED:
{
break;
}
}
}
const void CCalBtn::Draw_Button_Text(
CShadowDC &dc_shadow,
const CRectEx &irClient)
// Draw text of btn.
{
CString cstrCaption(_T(""));
GetWindowText(cstrCaption);
if(!cstrCaption.IsEmpty())
{
static CSizeEx m_isMargin(4, 0);
// Make font bold.
if(m_bIsHovered)
{
LOGFONT lfFont = { 0 };
m_pFont->GetLogFont(&lfFont);
lfFont.lfWeight = FW_BOLD;
m_pFont->DeleteObject();
m_pFont->CreateFontIndirect(&lfFont);
}
CFont *pFont_Old = dc_shadow.SelectObject(m_pFont);
const CSizeEx isCaption(dc_shadow.GetTextExtent(cstrCaption));
dc_shadow.SetBkMode(TRANSPARENT);
if(m_iState == eST_Disabled)
{
// Show as disabled.
dc_shadow.SetTextColor(m_crBtn_Internals_Disabled);
}
else
{
if(m_bIsPressed)
{
// Show as sunken.
dc_shadow.SetTextColor(m_crBtn_Internals_Pressed);
}
else
{
// Show as normal.
if(m_iStyle == eS_Flat)
{
if(m_bIsHovered)
{
// Show as raised.
dc_shadow.SetTextColor(m_crBtn_Internals_Raised);
}
else
{
// Show as neutral (sleeping).
dc_shadow.SetTextColor(m_crBtn_Internals_Sleeping);
}
}
else
{
// Show as raised.
dc_shadow.SetTextColor(m_crBtn_Internals_Sleeping);
}
}
}
switch(m_uTextAlign)
{
case TA_LEFT:
{
dc_shadow.TextOut(
irClient.left + m_isMargin.cx,
irClient.top + (irClient.Height() - isCaption.cy) / 2,
cstrCaption);
break;
}
case TA_CENTER:
{
dc_shadow.TextOut(
irClient.left + (irClient.Width() - isCaption.cx) / 2,
irClient.top + (irClient.Height() - isCaption.cy) / 2,
cstrCaption);
break;
}
case TA_RIGHT:
{
dc_shadow.TextOut(
irClient.right - isCaption.cx - m_isMargin.cx,
irClient.top + (irClient.Height() - isCaption.cy) / 2,
cstrCaption);
break;
}
}
// Make font normal.
if(m_bIsHovered)
{
LOGFONT lfFont = { 0 };
m_pFont->GetLogFont(&lfFont);
lfFont.lfWeight = FW_NORMAL;
m_pFont->DeleteObject();
m_pFont->CreateFontIndirect(&lfFont);
}
dc_shadow.SelectObject(pFont_Old);
}
}
const void CCalBtn::Draw_Checkmark(CShadowDC &dc_shadow, const CRectEx &irClient)
{
// Draw checkmark itself.
const COLORREF crCheckmark = (m_iState == eST_Disabled ? m_crBtn_Internals_Disabled : m_crBtn_Internals_Checkmark);
try
{
CPen Pen(PS_SOLID, 1, crCheckmark);
CPen *pPen_Old = dc_shadow.SelectObject(&Pen);
static const I_DEFAULT_DIM_MARGIN_CM
int iX = irClient.left;
int iY = irClient.top;
//
dc_shadow.MoveTo(iX + isMargin_CM.cx + 0, iY + isMargin_CM.cy + 0);
dc_shadow.LineTo(iX + 3, iY + isMargin_CM.cy + 0 + 3);
dc_shadow.MoveTo(iX + isMargin_CM.cx + 1, iY + isMargin_CM.cy + 1);
dc_shadow.LineTo(iX + 4, iY + isMargin_CM.cy + 1 + 3);
dc_shadow.MoveTo(iX + isMargin_CM.cx + 2, iY + isMargin_CM.cy + 2);
dc_shadow.LineTo(iX + 5, iY + isMargin_CM.cy + 2 + 3);
dc_shadow.MoveTo(iX + isMargin_CM.cx + 3, iY + isMargin_CM.cy + 1);
dc_shadow.LineTo(iX + 6, iY + isMargin_CM.cy + 1 + 3);
dc_shadow.MoveTo(iX + isMargin_CM.cx + 4, iY + isMargin_CM.cy + 0);
dc_shadow.LineTo(iX + 7, iY + isMargin_CM.cy + 0 + 3);
dc_shadow.MoveTo(iX + isMargin_CM.cx + 5, iY + isMargin_CM.cy - 1);
dc_shadow.LineTo(iX + 8, iY + isMargin_CM.cy - 1 + 3);
dc_shadow.MoveTo(iX + isMargin_CM.cx + 6, iY + isMargin_CM.cy - 2);
dc_shadow.LineTo(iX + 9, iY + isMargin_CM.cy - 2 + 3);
// Cleanup.
if(pPen_Old)
dc_shadow.SelectObject(pPen_Old);
}
catch(...)
{
TRACE(_T("Bad const void CCalBtn::Draw_Checkmark()\n"));
#if defined(NDEBUG)
::MessageBox((HWND)NULL, _T("Sorry to tell you but I've just crashed here: const void CCalBtn::Draw_Checkmark()"), _T("Ooops..."), MB_ICONSTOP);
#endif
}
}
const CCalBtn::EBehaviour CCalBtn::GetBehaviour()
// Return the btn. behavoiur.
{ return m_iBehaviour; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -