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

📄 calendar_btn.cpp

📁 一个完整的桌面日历程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 + -