DragonNest/Third/XTToolkitPro/Source/Calendar/XTPCalendarCaptionBarControl.cpp

1433 lines
35 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// // XTPCalendarCaptionBarControl.cpp : implementation file
//
// This file is a part of the XTREME CALENDAR MFC class library.
// (c)1998-2008 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Resource.h"
#include "Common/XTPResourceManager.h"
#include "Common/XTPOffice2007Image.h"
#include "XTPCalendarUtils.h"
#include "XTPCalendarThemeOffice2007.h"
#include "XTPCalendarControl.h"
#include "XTPCalendarCaptionBarControl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CXTPCalendarCaptionBarControl, CWnd)
IMPLEMENT_DYNAMIC(CXTPCalendarCaptionBarThemePart, CXTPCalendarWMHandler)
IMPLEMENT_DYNCREATE(CXTPCalendarCaptionBarTheme, CXTPCalendarWMHandler)
CXTPCalendarCaptionBarControl::CXTPCalendarCaptionBarControl()
{
RegisterWindowClass();
m_pTheme = NULL;
SetTheme(new CXTPCalendarCaptionBarTheme());
}
CXTPCalendarCaptionBarControl::~CXTPCalendarCaptionBarControl()
{
CMDTARGET_RELEASE(m_pTheme);
}
BOOL CXTPCalendarCaptionBarControl::RegisterWindowClass(HINSTANCE hInstance /*= NULL*/)
{
return XTPDrawHelpers()->RegisterWndClass(hInstance,
XTPCALENDARCAPTIONBAR_CLASSNAME, /*CS_DBLCLKS |*/ CS_HREDRAW | CS_VREDRAW);
}
BOOL CXTPCalendarCaptionBarControl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
if (!CWnd::Create(XTPCALENDARCAPTIONBAR_CLASSNAME, NULL, dwStyle, rect, pParentWnd, nID))
return FALSE;
AdjustLayout(NULL);
return TRUE;
}
BEGIN_MESSAGE_MAP(CXTPCalendarCaptionBarControl, CWnd)
//{{AFX_MSG_MAP(CXTPCalendarCaptionBarControl)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_KEYDOWN()
ON_WM_KEYUP()
ON_WM_KILLFOCUS()
ON_WM_DESTROY()
ON_WM_ENABLE()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CXTPCalendarCaptionBarControl::SetTheme(CXTPCalendarCaptionBarTheme* pTheme)
{
ASSERT(pTheme);
if (pTheme)
{
CMDTARGET_RELEASE(m_pTheme);
m_pTheme = pTheme;
m_pTheme->SetOwner(this);
m_pTheme->RefreshMetrics();
}
}
void CXTPCalendarCaptionBarControl::AdjustLayout(CDC* pDC, const CRect* prcWnd)
{
CXTPClientRect rcClient(this);
if (prcWnd)
((CRect&)rcClient) = *prcWnd;
if (m_pTheme)
m_pTheme->AdjustLayout(pDC, rcClient);
}
void CXTPCalendarCaptionBarControl::OnPaint()
{
CXTPClientRect rc(this);
if (rc.IsRectEmpty())
return;
CPaintDC dc(this); // device context for painting
CXTPBufferDC memDC(dc.GetSafeHdc(), rc);
if (m_pTheme)
m_pTheme->Draw(&memDC);
}
BOOL CXTPCalendarCaptionBarControl::OnEraseBkgnd(CDC* /*pDC*/)
{
return TRUE;
}
void CXTPCalendarCaptionBarControl::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
if (!GetSafeHwnd())
return;
CRect rcRect(0, 0, cx, cy);
if (m_pTheme)
m_pTheme->AdjustLayout(NULL, rcRect);
}
void CXTPCalendarCaptionBarControl::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_pTheme)
m_pTheme->OnLButtonDown(nFlags, point);
if (GetCapture() != this)
SetCapture();
}
void CXTPCalendarCaptionBarControl::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_pTheme)
m_pTheme->OnLButtonUp(nFlags, point);
if (GetCapture() == this)
ReleaseCapture();
}
void CXTPCalendarCaptionBarControl::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_pTheme)
m_pTheme->OnMouseMove(nFlags, point);
}
void CXTPCalendarCaptionBarControl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (m_pTheme)
m_pTheme->OnKeyDown(nChar, nRepCnt, nFlags);
}
void CXTPCalendarCaptionBarControl::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (m_pTheme)
m_pTheme->OnKeyUp(nChar, nRepCnt, nFlags);
}
void CXTPCalendarCaptionBarControl::OnTimer(UINT_PTR uTimerID)
{
if (m_pTheme)
m_pTheme->OnTimer(uTimerID);
}
void CXTPCalendarCaptionBarControl::OnDestroy()
{
if (m_pTheme)
m_pTheme->OnBeforeDestroy();
}
void CXTPCalendarCaptionBarControl::OnKillFocus (CWnd* pNewWnd)
{
if (m_pTheme)
m_pTheme->OnKillFocus(pNewWnd);
}
//////////////////////////////////////////////////////////////////////////
CXTPCalendarCaptionBarTheme::CXTPCalendarCaptionBarTheme()
{
m_pCaptionBar = NULL;
m_pCalendar = NULL;
m_nCheckHotStateTimerID = 0;
m_bIsSwitchViewButtons = TRUE;
m_bIsScrollDateButtons = TRUE;
m_bIsDateLabel = TRUE;
m_pButtonViewDay = new CSwitchViewButtonPart(this, xtpCalendarCaptionBar_ButtonViewDay);
m_pButtonViewWeek = new CSwitchViewButtonPart(this, xtpCalendarCaptionBar_ButtonViewWeek);
m_pButtonViewMonth = new CSwitchViewButtonPart(this, xtpCalendarCaptionBar_ButtonViewMonth);
m_pButtonViewDay->SetText(XTPResourceManager()->LoadString(XTP_IDS_CALENDAR_DAY));
m_pButtonViewWeek->SetText(XTPResourceManager()->LoadString(XTP_IDS_CALENDAR_WEEK));
m_pButtonViewMonth->SetText(XTPResourceManager()->LoadString(XTP_IDS_CALENDAR_MONTH));
m_pShowWorkWeek = new CRadioButtonPart(this, xtpCalendarCaptionBar_ShowWorkWeek);
m_pShowFullWeek = new CRadioButtonPart(this, xtpCalendarCaptionBar_ShowFullWeek);
m_pShowWorkWeek->SetText(XTPResourceManager()->LoadString(XTP_IDS_CALENDAR_SHOWWORKWEK));
m_pShowFullWeek->SetText(XTPResourceManager()->LoadString(XTP_IDS_CALENDAR_SHOWFULLKWEK));
m_pShowWorkWeek->SetCheck(1);
m_pShowFullWeek->SetCheck(0);
//---------------------------------
m_pScrollPrevDate = new CScrollDateButtonPart(this, xtpCalendarCaptionBar_ScrollPrevDate);
m_pScrollNextDate = new CScrollDateButtonPart(this, xtpCalendarCaptionBar_ScrollNextDate);
m_pDateLabel = new CDateLabelPart(this, xtpCalendarCaptionBar_DateLabel);
m_nPaintTheme = xtpCalendarThemeOffice2007;
RefreshMetrics();
}
CXTPCalendarCaptionBarTheme::~CXTPCalendarCaptionBarTheme()
{
m_Sink.UnadviseAll();
CMDTARGET_RELEASE(m_pButtonViewDay);
CMDTARGET_RELEASE(m_pButtonViewWeek);
CMDTARGET_RELEASE(m_pButtonViewMonth);
CMDTARGET_RELEASE(m_pShowWorkWeek);
CMDTARGET_RELEASE(m_pShowFullWeek);
CMDTARGET_RELEASE(m_pScrollPrevDate);
CMDTARGET_RELEASE(m_pScrollNextDate);
CMDTARGET_RELEASE(m_pDateLabel);
CMDTARGET_RELEASE(m_pCalendar);
}
void CXTPCalendarCaptionBarTheme::OnBeforeDestroy()
{
m_Sink.UnadviseAll();
CMDTARGET_RELEASE(m_pCalendar);
}
void CXTPCalendarCaptionBarTheme::SetOwner(CXTPCalendarCaptionBarControl* pCaptionBar)
{
ASSERT(pCaptionBar);
if (pCaptionBar)
{
m_pCaptionBar = pCaptionBar;
}
}
void CXTPCalendarCaptionBarTheme::AttachCalendar(CXTPCalendarControl* pCalendar)
{
m_Sink.UnadviseAll();
CMDTARGET_RELEASE(m_pCalendar);
m_pCalendar = pCalendar;
CMDTARGET_ADDREF(m_pCalendar);
if (m_pCalendar && m_pCalendar->GetConnection())
{
CXTPNotifyConnection* pConn = m_pCalendar->GetConnection();
m_Sink.Advise(pConn, XTP_NC_CALENDARVIEWWASCHANGED, &CXTPCalendarCaptionBarTheme::OnEvent_Calendar);
m_Sink.Advise(pConn, XTP_NC_CALENDAR_THEME_CHANGED, &CXTPCalendarCaptionBarTheme::OnEvent_Calendar);
UpdateControlsState();
if (XTPOffice2007Images() && XTPOffice2007Images()->GetConnection())
{
m_Sink.Advise(XTPOffice2007Images()->GetConnection(), XTP_NC_COMMON_OFFICE2007IMAGES_CHANGED,
&CXTPCalendarCaptionBarTheme::OnEvent_Office2007ImagesChanged);
}
}
}
int CXTPCalendarCaptionBarTheme::GetChildHandlersCount()
{
return m_arMembers.GetCount();
}
CXTPCalendarWMHandler* CXTPCalendarCaptionBarTheme::GetChildHandlerAt(int nIndex)
{
return m_arMembers.GetAt(nIndex);
}
void CXTPCalendarCaptionBarTheme::OnMouseMove(UINT nFlags, CPoint point)
{
CXTPCalendarWMHandler::OnMouseMove(nFlags, point);
if (GetOwnerWnd() && m_nCheckHotStateTimerID == 0)
{
m_nCheckHotStateTimerID = GetOwnerWnd()->SetTimer(1, 100, NULL);
}
}
BOOL CXTPCalendarCaptionBarTheme::OnTimer(UINT_PTR uTimerID)
{
if (uTimerID == m_nCheckHotStateTimerID && GetOwnerWnd() &&
::GetCapture() != GetOwnerWnd()->GetSafeHwnd())
{
BOOL bMouseLeave;
BOOL bChanged = _UpdateControlsHotState(&bMouseLeave);
if (bMouseLeave)
{
GetOwnerWnd()->KillTimer(1);
m_nCheckHotStateTimerID = 0;
}
if (bChanged)
GetOwnerWnd()->Invalidate(FALSE);
return TRUE;
}
return FALSE;
}
CRect CXTPCalendarCaptionBarTheme::CalcMinRect(CDC* /*pDC*/)
{
if (!IsSwitchViewButtons() &&
!IsScrollDateButtons() &&
!IsDateLabel())
{
return CRect(0, 0, 0, 0);
}
CRect rc(0, 0, 525, 71);
if (!IsSwitchViewButtons())
rc.bottom -= 27;
if (!IsScrollDateButtons() && !IsDateLabel())
rc.bottom -= 33;
return rc;
};
void CXTPCalendarCaptionBarTheme::AdjustLayout(CDC* pDC, const CRect& rcRect)
{
if (!pDC && GetOwnerWnd() && GetOwnerWnd()->m_hWnd)
{
CClientDC dc(GetOwnerWnd());
AdjustLayout(&dc, rcRect);
return;
}
m_rcRect = rcRect;
CRect rc00(rcRect.left, rcRect.top, rcRect.left, rcRect.top);
CRect rc = m_rcRect;
//rc.DeflateRect(1, 1, 1, 0);
rc.DeflateRect(0, 1, 0, 0);
int nNextY = rc.top;
m_pButtonViewDay->SetVisible(IsSwitchViewButtons());
m_pButtonViewWeek->SetVisible(IsSwitchViewButtons());
m_pButtonViewMonth->SetVisible(IsSwitchViewButtons());
if (IsSwitchViewButtons())
{
rc.bottom = rc.top + 26;
rc.right = rc.left + 83;
m_pButtonViewDay->AdjustLayout(pDC, rc);
rc.left = m_pButtonViewDay->GetRect().right;
rc.right = rc.left + 83;
m_pButtonViewWeek->AdjustLayout(pDC, rc);
rc.left = m_pButtonViewWeek->GetRect().right;
rc.right = rc.left + 83;
m_pButtonViewMonth->AdjustLayout(pDC, rc);
//--------------------------------------
rc.left = m_pButtonViewMonth->GetRect().right + 21;
rc.right = rc.left + 5;
m_pShowWorkWeek->AdjustLayout(pDC, rc);
rc.left = m_pShowWorkWeek->GetRect().right + 11;
rc.right = rc.left + 5;
m_pShowFullWeek->AdjustLayout(pDC, rc);
//--------------------------------------
// to align next controls
rc = m_pButtonViewDay->GetRect();
nNextY = rc.bottom + 1;
}
else
{
m_pButtonViewDay->AdjustLayout(pDC, rc00);
m_pButtonViewWeek->AdjustLayout(pDC, rc00);
m_pButtonViewMonth->AdjustLayout(pDC, rc00);
m_pShowWorkWeek->SetVisible(FALSE);
m_pShowFullWeek->SetVisible(FALSE);
m_pShowWorkWeek->AdjustLayout(pDC, rc00);
m_pShowFullWeek->AdjustLayout(pDC, rc00);
nNextY = rc.top;
}
int nNextX = rc.left;
//--------------------------------------
m_pScrollPrevDate->SetVisible(IsScrollDateButtons());
m_pScrollNextDate->SetVisible(IsScrollDateButtons());
if (IsScrollDateButtons())
{
rc.top = nNextY + 12;
rc.bottom = rc.top + 20;
rc.left += 20;
rc.right = rc.left + 20;
m_pScrollPrevDate->AdjustLayout(pDC, rc);
rc.left = m_pScrollPrevDate->GetRect().right + 9;
rc.right = rc.left + 20;
m_pScrollNextDate->AdjustLayout(pDC, rc);
nNextX = rc.right;
}
else
{
m_pScrollPrevDate->AdjustLayout(pDC, rc00);
m_pScrollNextDate->AdjustLayout(pDC, rc00);
}
//--------------------------------------
m_pDateLabel->SetVisible(IsDateLabel());
if (IsDateLabel())
{
rc.top = nNextY + 12;
rc.bottom = rc.top + 20;
rc.left = nNextX + 11;
rc.right = m_rcRect.right - 2;
m_pDateLabel->AdjustLayout(pDC, rc);
}
else
{
m_pDateLabel->AdjustLayout(pDC, rc00);
}
}
COLORREF CXTPCalendarCaptionBarTheme::GetColor2(LPCTSTR pcszColorName, COLORREF clrDefault)
{
COLORREF clrColor = COLORREF_NULL;
if (XTPOffice2007Images()->IsValid())
{
clrColor = XTPOffice2007Images()->GetImageColor(_T("CalendarControl"), pcszColorName);
}
if (clrColor == COLORREF_NULL)
{
clrColor = clrDefault;
}
return clrColor;
}
void CXTPCalendarCaptionBarTheme::RefreshMetrics()
{
m_themeButton.OpenTheme(0, L"BUTTON");
LOGFONT lfBaseFont;
::ZeroMemory(&lfBaseFont, sizeof(lfBaseFont));
BOOL bUseFont2007 = FALSE;
if (GetPaintTheme() >= xtpCalendarThemeOffice2007)
{
m_clrSwitchViewBarBk.SetStandardValue(GetColor2(_T("CaptionBarSwitchViewBarBk"), RGB(173, 209, 255)));
m_clrScrollDateBarBk.SetStandardValue(GetColor2(_T("CaptionBarDateBarBk"), RGB(227, 239, 255)));
m_clrBorders.SetStandardValue(GetColor2(_T("CaptionBarBorders"), RGB(101, 147, 201)));
m_clrTextColor.SetStandardValue(RGB(0, 0, 0));
// Try to set default Office 2007 font,
// otherwise icon font used.
bUseFont2007 = XTPDrawHelpers()->FontExists(XTP_CALENDAR_OFFICE2007_FONT_NAME);
}
else
{
//m_clrSwitchViewBarBk.SetStandardValue(RGB(192, 192, 192));
m_clrSwitchViewBarBk.SetStandardValue(GetSysColor(COLOR_BTNFACE));
if (GetPaintTheme() == xtpCalendarThemeOffice2000)
m_clrScrollDateBarBk.SetStandardValue(RGB(146, 146, 146));
else
m_clrScrollDateBarBk.SetStandardValue(RGB(130, 130, 130));
m_clrBorders.SetStandardValue(RGB(130, 130, 130));
m_clrTextColor.SetStandardValue(RGB(255, 255, 255));
}
if (bUseFont2007)
{
STRCPY_S(lfBaseFont.lfFaceName, LF_FACESIZE, XTP_CALENDAR_OFFICE2007_FONT_NAME);
lfBaseFont.lfCharSet = DEFAULT_CHARSET;
lfBaseFont.lfHeight = -11;
lfBaseFont.lfWeight = FW_NORMAL;
if (XTPSystemVersion()->IsClearTypeTextQualitySupported())
lfBaseFont.lfQuality = 5;
}
else
{
VERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lfBaseFont), &lfBaseFont, 0));
}
m_fntTextFont.SetStandardValue(&lfBaseFont);
//-----------------------------------------------
int nCount = m_arMembers.GetCount();
for (int i = 0; i < nCount; i++)
{
CXTPCalendarCaptionBarThemePart* pPart = m_arMembers.GetAt(i);
ASSERT(pPart);
if (pPart)
pPart->RefreshMetrics();
}
//-----------------------------------------------
AdjustLayout(NULL, GetRect());
}
void CXTPCalendarCaptionBarTheme::Draw(CDC* pDC)
{
#ifdef _DEBUG
pDC->FillSolidRect(GetRect(), RGB(255, 0, 0));
#endif
// Fill SwitchViewBar
CRect rcTopPart = m_pButtonViewDay->GetRect();
rcTopPart.right = m_rcRect.right;
pDC->FillSolidRect(rcTopPart, m_clrSwitchViewBarBk);
rcTopPart.top = rcTopPart.bottom;
rcTopPart.bottom++;
pDC->FillSolidRect(rcTopPart, m_clrBorders); // m_clrSwitchViewBarBottomBorder);
// Fill ScrollDateBar
CRect rcBottomPart = m_rcRect;
rcBottomPart.top = rcTopPart.bottom;
pDC->FillSolidRect(rcBottomPart, m_clrScrollDateBarBk);
// Draw borders
CRect rc = m_rcRect;
rc.bottom = rc.top + 1;
pDC->FillSolidRect(rc, m_clrBorders);
// Draw members
int nCount = m_arMembers.GetCount();
for (int i = 0; i < nCount; i++)
{
CXTPCalendarCaptionBarThemePart* pPart = m_arMembers.GetAt(i);
ASSERT(pPart);
if (pPart)
pPart->Draw(pDC);
}
}
//////////////////////////////////////////////////////////////////////////
CXTPCalendarCaptionBarThemePart::CXTPCalendarCaptionBarThemePart(CXTPCalendarCaptionBarTheme* pTheme, int nPartID)
{
ASSERT(pTheme);
m_pTheme = pTheme;
m_nPartID = nPartID;
m_nState = xtpBtnStateNormal;
m_bVisible = TRUE;
if (m_pTheme)
m_pTheme->m_arMembers.Add(this, TRUE);
}
CXTPCalendarCaptionBarThemePart::~CXTPCalendarCaptionBarThemePart()
{
}
void CXTPCalendarCaptionBarThemePart::AdjustLayout(CDC* /*pDC*/, const CRect& rcRect)
{
m_rcRect = rcRect;
}
COLORREF CXTPCalendarCaptionBarThemePart::GetTextColor()
{
if (m_clrTextColor.IsDefaultValue() && m_pTheme)
return (COLORREF)m_pTheme->m_clrTextColor;
return (COLORREF)m_clrTextColor;
}
void CXTPCalendarCaptionBarThemePart::Draw(CDC* /*pDC*/)
{
};
BOOL CXTPCalendarCaptionBarThemePart::HitTest(const CPoint& pt)
{
return IsVisible() && m_rcRect.PtInRect(pt);
};
void CXTPCalendarCaptionBarThemePart::Redraw(BOOL bUpdateNow)
{
if (m_pTheme)
m_pTheme->Redraw(bUpdateNow);
}
void CXTPCalendarCaptionBarTheme::Redraw(BOOL bUpdateNow)
{
if (GetOwnerWnd() && GetOwnerWnd()->GetSafeHwnd())
{
GetOwnerWnd()->Invalidate(FALSE);
if (bUpdateNow)
GetOwnerWnd()->UpdateWindow();
}
}
void CXTPCalendarCaptionBarThemePart::OnMouseMove(UINT nFlags, CPoint point)
{
UNREFERENCED_PARAMETER(nFlags);
int nStatePrev = m_nState;
if (HitTest(point))
m_nState = m_nState | xtpBtnStateMouseOver;
else
m_nState = m_nState & (~(xtpBtnStateMouseOver));
if (nStatePrev != m_nState)
Redraw();
}
BOOL CXTPCalendarCaptionBarThemePart::OnLButtonDown(UINT nFlags, CPoint point)
{
UNREFERENCED_PARAMETER(nFlags);
int nStatePrev = m_nState;
BOOL bHitTest = HitTest(point);
if (bHitTest)
{
m_nState = m_nState | xtpBtnStatePressed | xtpBtnStateFocused;
}
else
m_nState = m_nState & (~(xtpBtnStatePressed | xtpBtnStateFocused));
if (nStatePrev != m_nState)
Redraw();
return FALSE; // to allow receive this notification for all other parts (to clear state)
}
BOOL CXTPCalendarCaptionBarThemePart::OnLButtonUp(UINT nFlags, CPoint point)
{
UNREFERENCED_PARAMETER(nFlags);
int nStatePrev = m_nState;
BOOL bHitTest = HitTest(point);
if (bHitTest && (m_nState & (xtpBtnStatePressed | xtpBtnStateFocused)))
{
m_nState = m_nState & (~xtpBtnStatePressed);
if (m_pTheme && IsVisible())
m_pTheme->OnPartClick(m_nPartID);
}
m_nState = m_nState & (~xtpBtnStatePressed);
if (nStatePrev != m_nState)
Redraw();
return FALSE; // to allow receive this notification for all other parts (to clear state)
}
void CXTPCalendarCaptionBarTheme::OnEvent_Calendar(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(lParam);
if (Event == XTP_NC_CALENDARVIEWWASCHANGED)
{
UpdateControlsState();
}
else if (Event == XTP_NC_CALENDAR_THEME_CHANGED)
{
SetPaintTheme(GetCalendarCtrl()->GetPaintTheme());
}
else {
ASSERT(FALSE);
return;
}
if (GetOwnerWnd())
GetOwnerWnd()->Invalidate(FALSE);
}
void CXTPCalendarCaptionBarTheme::OnEvent_Office2007ImagesChanged(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(lParam);
if (Event == XTP_NC_COMMON_OFFICE2007IMAGES_CHANGED)
{
RefreshMetrics();
Redraw();
}
}
void CXTPCalendarCaptionBarTheme::UpdateControlsState()
{
if (!GetCalendarCtrl() || !GetCalendarCtrl()->GetActiveView())
{
return;
}
m_pShowWorkWeek->SetVisible(FALSE);
m_pShowFullWeek->SetVisible(FALSE);
m_pButtonViewDay->SetCheck(0);
m_pButtonViewWeek->SetCheck(0);
m_pButtonViewMonth->SetCheck(0);
int nViewType = GetCalendarCtrl()->GetActiveView()->GetViewType();
if (nViewType == xtpCalendarDayView)
{
m_pButtonViewDay->SetCheck(1);
}
else if (nViewType == xtpCalendarMonthView)
{
m_pButtonViewMonth->SetCheck(1);
}
else if (nViewType == xtpCalendarWeekView)
{
// the theme 2003 view type.
}
else
{
m_pButtonViewWeek->SetCheck(1);
if (IsSwitchViewButtons())
{
m_pShowWorkWeek->SetVisible(TRUE);
m_pShowFullWeek->SetVisible(TRUE);
}
if (nViewType == xtpCalendarWorkWeekView)
{
m_pShowWorkWeek->SetCheck(1);
m_pShowFullWeek->SetCheck(0);
}
else if (nViewType == xtpCalendarFullWeekView)
{
m_pShowWorkWeek->SetCheck(0);
m_pShowFullWeek->SetCheck(1);
}
else {
ASSERT(FALSE);
}
}
}
void CXTPCalendarCaptionBarTheme::OnPartClick(int nPartID)
{
// TRACE(_T("%d = CXTPCalendarCaptionBarTheme::OnPartClick(PartID=%d) \n"), dbg_xtp_Counter++, nPartID);
if (!GetCalendarCtrl() || !GetCalendarCtrl()->GetActiveView())
{
ASSERT(FALSE);
return;
}
if (nPartID == xtpCalendarCaptionBar_ButtonViewDay)
{
GetCalendarCtrl()->SwitchActiveView(xtpCalendarDayView);
GetCalendarCtrl()->SetFocus();
}
else if (nPartID == xtpCalendarCaptionBar_ButtonViewWeek)
{
if (m_pShowWorkWeek->GetCheck())
GetCalendarCtrl()->SwitchActiveView(xtpCalendarWorkWeekView);
else
GetCalendarCtrl()->SwitchActiveView(xtpCalendarFullWeekView);
GetCalendarCtrl()->SetFocus();
}
else if (nPartID == xtpCalendarCaptionBar_ButtonViewMonth)
{
GetCalendarCtrl()->SwitchActiveView(xtpCalendarMonthView);
GetCalendarCtrl()->SetFocus();
}
else if (nPartID == xtpCalendarCaptionBar_ShowWorkWeek)
{
GetCalendarCtrl()->SwitchActiveView(xtpCalendarWorkWeekView);
GetCalendarCtrl()->SetFocus();
}
else if (nPartID == xtpCalendarCaptionBar_ShowFullWeek)
{
GetCalendarCtrl()->SwitchActiveView(xtpCalendarFullWeekView);
GetCalendarCtrl()->SetFocus();
}
else if (nPartID == xtpCalendarCaptionBar_ScrollPrevDate ||
nPartID == xtpCalendarCaptionBar_ScrollNextDate)
{
CXTPCalendarView* pActiveView = GetCalendarCtrl()->GetActiveView();
int nViewType = pActiveView->GetViewType();
BOOL bNext = nPartID == xtpCalendarCaptionBar_ScrollNextDate;
COleDateTime dtSelStart, dtSelEnd, dtFirst;
int nGroupIndex = 0;
BOOL bAllDay = TRUE;
dtFirst = pActiveView->GetViewDayDate(0);
if (!pActiveView->GetSelection(&dtSelStart, &dtSelEnd, &bAllDay, &nGroupIndex))
{
dtSelStart = dtFirst;
dtSelEnd = dtFirst + COleDateTimeSpan(1);
}
if (nViewType == xtpCalendarDayView)
{
int nDays = pActiveView->GetViewDayCount();
dtSelStart += COleDateTimeSpan(bNext ? nDays : -nDays);
dtSelEnd += COleDateTimeSpan(bNext ? nDays : -nDays);
}
else if (nViewType == xtpCalendarWorkWeekView ||
nViewType == xtpCalendarFullWeekView ||
nViewType == xtpCalendarWeekView)
{
dtSelStart += COleDateTimeSpan(bNext ? 7 : -7);
dtSelEnd += COleDateTimeSpan(bNext ? 7 : -7);
}
else if (nViewType == xtpCalendarMonthView)
{
int nSelDay = dtSelStart.GetDay();
CXTPCalendarUtils::ShiftDate_Month(dtSelStart, bNext ? 1 : -1, 1);
CXTPCalendarUtils::UpdateMonthDay(dtSelStart, nSelDay);
dtSelEnd = dtSelStart + COleDateTimeSpan(1);
}
else
{
ASSERT(FALSE);
}
pActiveView->SetSelection(dtSelStart, dtSelEnd, bAllDay, nGroupIndex);
GetCalendarCtrl()->SwitchActiveView((XTPCalendarViewType)nViewType);
}
else
{
return;
}
UpdateControlsState();
if (GetOwnerWnd())
GetOwnerWnd()->Invalidate(FALSE);
}
BOOL CXTPCalendarCaptionBarTheme::_UpdateControlsHotState(BOOL* pbMouseLeave)
{
if (pbMouseLeave)
*pbMouseLeave = FALSE;
CPoint ptMouse(0, 0);
if (GetCursorPos(&ptMouse) && GetOwnerWnd())
GetOwnerWnd()->ScreenToClient(&ptMouse);
else
return FALSE;
BOOL bMouseLeave = !m_rcRect.PtInRect(ptMouse);
if (pbMouseLeave)
*pbMouseLeave = bMouseLeave;
if (!bMouseLeave)
return FALSE;
BOOL bResetFocused = CWnd::GetFocus() != GetOwnerWnd();
//-------------------------------------------------------------------------
BOOL bChanged = FALSE;
int nCount = m_arMembers.GetCount();
for (int i = 0; i < nCount; i++)
{
CXTPCalendarCaptionBarThemePart* pPart = m_arMembers.GetAt(i);
ASSERT(pPart);
if (pPart)
{
int nNewState = pPart->GetState() & (~(CXTPCalendarCaptionBarThemePart::xtpBtnStateMouseOver |
CXTPCalendarCaptionBarThemePart::xtpBtnStatePressed));
if (bResetFocused)
nNewState = nNewState & (~CXTPCalendarCaptionBarThemePart::xtpBtnStateFocused);
if (nNewState != pPart->GetState())
{
pPart->SetState(nNewState);
bChanged = TRUE;
}
}
}
return bChanged;
}
void CXTPCalendarCaptionBarTheme::OnKillFocus (CWnd* pNewWnd)
{
UNREFERENCED_PARAMETER(pNewWnd);
BOOL bChanged = _UpdateControlsHotState();
if (bChanged)
GetOwnerWnd()->Invalidate(FALSE);
}
void CXTPCalendarCaptionBarTheme::CSwitchViewButtonPart::RefreshMetrics()
{
if (GetPaintTheme() <= xtpCalendarThemeOffice2003)
{
m_clrTextColor.SetStandardValue(RGB(0, 0, 0));
}
}
void CXTPCalendarCaptionBarTheme::CSwitchViewButtonPart::AdjustLayout(CDC* pDC, const CRect& rcRect)
{
m_rcRect = rcRect;
if (m_rcRect.IsRectEmpty())
return;
if (pDC)
{
CXTPFontDC autoFont(pDC, GetTheme()->m_fntTextFont);
CSize szText = pDC->GetTextExtent(GetText());
if (szText.cx + 8 > m_rcRect.Width())
m_rcRect.right = m_rcRect.left + szText.cx + 8;
}
}
void CXTPCalendarCaptionBarTheme::CSwitchViewButtonPart::Draw(CDC* pDC)
{
if (!IsVisible())
return;
CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(_T("CALENDARCAPTIONBARSWITCHVIEWBUTTON"));
CRect rcRect = GetRect();
ASSERT(pImage);
if (!pImage || !GetTheme())
{
pDC->FillSolidRect(rcRect , RGB(155, 0, 0));
return;
}
if (GetPaintTheme() >= xtpCalendarThemeOffice2007)
{
int nImagePart = (m_nState & xtpBtnStateChecked) ? 3 : 0;
if (m_nState & xtpBtnStatePressed)
{
nImagePart += 2;
}
else if (m_nState & xtpBtnStateMouseOver)
{
nImagePart += 1;
}
pImage->DrawImage(pDC, rcRect, pImage->GetSource(nImagePart, 6), CRect(0, 0, 0, 0));
rcRect.left = rcRect.right - 1;
pDC->FillSolidRect(&rcRect, GetTheme()->m_clrBorders);
}
else
{
if (GetTheme()->m_themeButton.IsAppThemed() &&
GetPaintTheme() == xtpCalendarThemeOffice2003)
{
int nState = (m_nState & xtpBtnStatePressed) ? PBS_PRESSED :
(m_nState & xtpBtnStateMouseOver) ? PBS_HOT: PBS_NORMAL;
if (m_nState & xtpBtnStateChecked)
nState = PBS_PRESSED;
GetTheme()->m_themeButton.DrawThemeBackground(pDC->GetSafeHdc(), BP_PUSHBUTTON, nState, rcRect, NULL);
}
else
{
UINT uFlags = DFCS_BUTTONPUSH | //DFCS_FLAT |
((m_nState & xtpBtnStateChecked) ? DFCS_CHECKED : 0) |
((m_nState & xtpBtnStatePressed) ? DFCS_PUSHED : 0); // | (bEnabled ? 0 : DFCS_INACTIVE)
::DrawFrameControl(pDC->GetSafeHdc(), rcRect, DFC_BUTTON, uFlags);
}
}
// drawText
CFont fntTmp;
CXTPFontDC autoFont(pDC, GetTheme()->m_fntTextFont, GetTextColor());
if ((m_nState & xtpBtnStateChecked) && GetPaintTheme() <= xtpCalendarThemeOffice2003)
{
LOGFONT lf;
if (GetTheme()->m_fntTextFont->GetLogFont(&lf))
{
lf.lfWeight = FW_BOLD;
if (fntTmp.CreateFontIndirect(&lf))
autoFont.SetFont(&fntTmp);
}
}
CRect rcText = GetRect();
rcText.DeflateRect(1, 1, 1, 1);
pDC->SetBkMode(TRANSPARENT);
pDC->DrawText(GetText(), rcText, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
}
LPCTSTR CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::_GetImageName()
{
if (m_nPartID == xtpCalendarCaptionBar_ScrollNextDate)
return _T("CALENDARCAPTIONBARNEXTDATEBUTTON");
return _T("CALENDARCAPTIONBARPREVDATEBUTTON");
}
void CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::AdjustLayout(CDC* /*pDC*/, const CRect& rcRect)
{
m_rcRect = rcRect;
if (m_rcRect.IsRectEmpty())
return;
CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(_GetImageName());
ASSERT(pImage);
if (!pImage || !GetTheme())
return;
CRect rcImage = pImage->GetSource(0, 4);
m_rcRect.right = m_rcRect.left + rcImage.Width();
m_rcRect.bottom = m_rcRect.top + rcImage.Height();
}
void CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::Draw(CDC* pDC)
{
if (!IsVisible())
return;
CRect rcRect = GetRect();
CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(_GetImageName());
ASSERT(pImage);
if (!pImage || !GetTheme())
{
pDC->FillSolidRect(rcRect, RGB(155, 0, 0));
return;
}
if (GetPaintTheme() == xtpCalendarThemeOffice2007)
{
int nImagePart = (m_nState & xtpBtnStatePressed) ? 2 : (m_nState & xtpBtnStateMouseOver) ? 1 : 0;
pImage->DrawImage(pDC, rcRect, pImage->GetSource(nImagePart, 4),
CRect(0, 0, 0, 0), RGB(255, 0, 255));
if (m_nState & xtpBtnStateFocused)
pImage->DrawImage(pDC, GetRect(), pImage->GetSource(3, 4),
CRect(1, 1, 1, 1), RGB(255, 0, 255));
}
else
{
if (GetTheme()->m_themeButton.IsAppThemed() &&
GetPaintTheme() == xtpCalendarThemeOffice2003)
{
int nState = (m_nState & xtpBtnStatePressed) ? PBS_PRESSED :
(m_nState & xtpBtnStateMouseOver) ? PBS_HOT: PBS_NORMAL;
GetTheme()->m_themeButton.DrawThemeBackground(pDC->GetSafeHdc(), BP_PUSHBUTTON, nState, rcRect, NULL);
}
else
{
UINT uFlags = DFCS_BUTTONPUSH |
((m_nState & xtpBtnStateChecked) ? DFCS_CHECKED : 0) |
((m_nState & xtpBtnStatePressed) ? DFCS_PUSHED : 0); // | (bEnabled ? 0 : DFCS_INACTIVE)
::DrawFrameControl(pDC->GetSafeHdc(), rcRect, DFC_BUTTON, uFlags);
}
BOOL bLeftDirection = GetPartID() == xtpCalendarCaptionBar_ScrollPrevDate;
DrawScrollTriangle(pDC, rcRect, bLeftDirection, RGB(0, 0, 0));
}
}
void CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::_DrawTriangle(CDC* pDC, CPoint pt0, CPoint pt1, CPoint pt2, COLORREF clrColor)
{
CXTPPenDC pen (*pDC, clrColor);
CXTPBrushDC brush (*pDC, clrColor);
CPoint pts[3];
pts[0] = pt0;
pts[1] = pt1;
pts[2] = pt2;
pDC->Polygon(pts, 3);
}
void CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::DrawScrollTriangle(CDC* pDC, CRect rcRect, BOOL bLeftDirection, COLORREF clrColor)
{
CPoint ptCenter(rcRect.CenterPoint());
ptCenter.y--;
if (bLeftDirection)
{
ptCenter.x -= 3;
_DrawTriangle(pDC, ptCenter, CPoint(ptCenter.x + 4, ptCenter.y - 4),
CPoint(ptCenter.x + 4, ptCenter.y + 4), clrColor);
}
else
{
ptCenter.x += 2;
_DrawTriangle(pDC, ptCenter, CPoint(ptCenter.x - 4, ptCenter.y - 4),
CPoint(ptCenter.x - 4, ptCenter.y + 4), clrColor);
}
}
BOOL CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::OnLButtonDown(UINT nFlags, CPoint point)
{
CXTPCalendarCaptionBarThemePart::OnLButtonDown(nFlags, point);
if (GetTheme() && GetTheme()->GetOwnerWnd() && HitTest(point) &&
CWnd::GetFocus() != GetTheme()->GetOwnerWnd() )
{
GetTheme()->GetOwnerWnd()->SetFocus();
}
return FALSE;
}
void CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
UNREFERENCED_PARAMETER(nRepCnt); UNREFERENCED_PARAMETER(nFlags);
if (!IsVisible())
return;
if ((m_nState & xtpBtnStateFocused) && (m_nState & xtpBtnStatePressed) == 0 &&
nChar == VK_SPACE)
{
m_nState |= xtpBtnStatePressed;
Redraw();
}
}
void CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
UNREFERENCED_PARAMETER(nRepCnt); UNREFERENCED_PARAMETER(nFlags);
if (!IsVisible())
return;
int nMask = xtpBtnStateFocused | xtpBtnStatePressed;
if ((m_nState & nMask) == nMask && nChar == VK_SPACE && GetTheme())
{
GetTheme()->OnPartClick(GetPartID());
}
if (nChar == VK_SPACE)
{
m_nState = m_nState & (~xtpBtnStatePressed);
Redraw();
}
}
void CXTPCalendarCaptionBarTheme::CRadioButtonPart::RefreshMetrics()
{
if (GetPaintTheme() <= xtpCalendarThemeOffice2003)
{
m_clrTextColor.SetStandardValue(RGB(0, 0, 0));
}
}
void CXTPCalendarCaptionBarTheme::CRadioButtonPart::AdjustLayout(CDC* pDC, const CRect& rcRect)
{
m_rcRect = rcRect;
if (m_rcRect.IsRectEmpty())
return;
CSize szRadio(13, 13);
CRect rcRadio = GetRect();
if (GetTheme() && GetTheme()->m_themeButton.IsAppThemed())
{
GetTheme()->m_themeButton.GetThemePartSize(NULL, BP_RADIOBUTTON, 1, rcRadio, TS_DRAW, &szRadio);
}
if (pDC)
{
CXTPFontDC autoFont(pDC, GetTheme()->m_fntTextFont);
CSize szText = pDC->GetTextExtent(GetText());
if (szRadio.cx + 9 + szText.cx + 8 > m_rcRect.Width())
m_rcRect.right = m_rcRect.left + szRadio.cx + 9 + szText.cx + 8;
szRadio.cy = max(szRadio.cy, szText.cy);
}
m_rcRect.top += (m_rcRect.Height() - szRadio.cy) / 2 + 1;
m_rcRect.bottom = m_rcRect.top + szRadio.cy;
}
void CXTPCalendarCaptionBarTheme::CRadioButtonPart::Draw(CDC* pDC)
{
if (!IsVisible())
return;
CSize szRadio(13, 13);
CRect rcRadio = GetRect();
BOOL bThemed = GetTheme() && GetTheme()->m_themeButton.IsAppThemed() &&
GetPaintTheme() >= xtpCalendarThemeOffice2003;
if (bThemed)
{
GetTheme()->m_themeButton.GetThemePartSize(NULL, BP_RADIOBUTTON, 1, rcRadio, TS_DRAW, &szRadio);
}
rcRadio.top += (rcRadio.Height() - szRadio.cy) / 2 + 1;
rcRadio.bottom = rcRadio.top + szRadio.cy;
rcRadio.right = rcRadio.left + szRadio.cx;
if (bThemed)
{
GetTheme()->m_themeButton.GetThemePartSize(NULL, BP_RADIOBUTTON, 1, rcRadio, TS_DRAW, &szRadio);
//-------------------
int nState = (m_nState & xtpBtnStatePressed) ? RBS_UNCHECKEDPRESSED :
(m_nState & xtpBtnStateMouseOver) ? RBS_UNCHECKEDHOT: RBS_UNCHECKEDNORMAL;
if (m_nState & xtpBtnStateChecked)
nState += 4;
GetTheme()->m_themeButton.DrawThemeBackground(pDC->GetSafeHdc(), BP_RADIOBUTTON, nState, rcRadio, NULL);
}
else
{
UINT uFlags = DFCS_BUTTONRADIO | //DFCS_FLAT |
((m_nState & xtpBtnStateChecked) ? DFCS_CHECKED : 0) |
((m_nState & xtpBtnStatePressed) ? DFCS_PUSHED : 0); // | (bEnabled ? 0 : DFCS_INACTIVE)
if (GetPaintTheme() > xtpCalendarThemeOffice2000)
uFlags |= DFCS_FLAT;
::DrawFrameControl(pDC->GetSafeHdc(), rcRadio, DFC_BUTTON, uFlags);
}
// drawText
CXTPFontDC autoFont(pDC, GetTheme()->m_fntTextFont, GetTextColor());
pDC->SetBkMode(TRANSPARENT);
CRect rcText = GetRect();
rcText.bottom +=1;
rcText.left = rcRadio.right + 9;
pDC->DrawText(GetText(), rcText, DT_BOTTOM | DT_LEFT | DT_SINGLELINE);
rcText.left--;
rcText.right++;
if (m_nState & xtpBtnStatePressed)
pDC->DrawFocusRect(rcText);
}
void CXTPCalendarCaptionBarTheme::CDateLabelPart::RefreshMetrics()
{
if (!GetTheme())
return;
m_clrTextColor.SetStandardValue(GetTheme()->m_clrTextColor);
LOGFONT lfBaseFont;
::ZeroMemory(&lfBaseFont, sizeof(lfBaseFont));
GetTheme()->m_fntTextFont->GetLogFont(&lfBaseFont);
lfBaseFont.lfHeight = -20;
m_fntTextFont.SetStandardValue(&lfBaseFont);
}
void CXTPCalendarCaptionBarTheme::CDateLabelPart::Draw(CDC* pDC)
{
if (!IsVisible())
return;
CXTPFontDC autoFont(pDC, m_fntTextFont, m_clrTextColor);
pDC->SetBkMode(TRANSPARENT);
CXTPCalendarView* pCalView = XTP_SAFE_GET2(GetTheme(), GetCalendarCtrl(), GetActiveView(), NULL);
ASSERT(pCalView);
if (!pCalView || !IsVisible())
return;
BOOL bShowMonthDay = pCalView->GetViewType() != xtpCalendarMonthView;
COleDateTime dtDay1 = pCalView->GetViewDayDate(0);
COleDateTime dtDay2 = pCalView->GetViewDayDate(max(0, pCalView->GetViewDayCount() - 1));
m_strText = _FormatDate(dtDay1, dtDay2, bShowMonthDay);
CRect rcText = GetRect();
rcText.bottom +=1;
UINT uFlags = DT_BOTTOM | DT_SINGLELINE;
if (GetTheme() && !GetTheme()->IsScrollDateButtons() &&
GetPaintTheme() < xtpCalendarThemeOffice2007)
{
uFlags |= DT_RIGHT;
rcText.right = max(rcText.left, rcText.right - 9);
}
pDC->DrawText(GetText(), rcText, uFlags);
}
LPCTSTR CXTPCalendarCaptionBarTheme::CDateLabelPart::_AddSpace(CString& rStr)
{
if (!rStr.IsEmpty())
rStr = rStr + _T(' ');
return (LPCTSTR)rStr;
}
CString CXTPCalendarCaptionBarTheme::CDateLabelPart::_FormatDate(COleDateTime dtDay1, COleDateTime dtDay2,
BOOL bShowMonthDay)
{
//LOCALE_IDATE - short date format ordering
// 0 Month-Day-Year
// 1 Day-Month-Year
// 2 Year-Month-Day
int nDateOrdering = CXTPCalendarUtils::GetLocaleLong(LOCALE_IDATE);
CString strDay1(bShowMonthDay ? _T("d") : _T(""));
CString strDay2(strDay1);
CString strMonth1;
CString strMonth2 = _T("MMMM");
if (dtDay1.GetMonth() != dtDay2.GetMonth())
strMonth1 = _T("MMMM");
CString strYear1;
CString strYear2;
strYear2 = _T("yyyy");
if (dtDay1.GetYear() != dtDay2.GetYear())
strYear1 = _T("yyyy");
CString strFormat1, strFormat2;
if (nDateOrdering == 1)
{
strFormat1.Format(_T("%s%s%s"), _AddSpace(strDay1), _AddSpace(strMonth1), _AddSpace(strYear1));
strFormat2.Format(_T("%s%s%s"), _AddSpace(strDay2), _AddSpace(strMonth2), (LPCTSTR)strYear2);
}
else
{
if (!strYear1.IsEmpty() && !strDay1.IsEmpty())
strDay1 += _T(",");
if (!strYear2.IsEmpty() && !strDay2.IsEmpty())
strDay2 += _T(",");
strFormat1.Format(_T("%s%s%s"), _AddSpace(strMonth1), _AddSpace(strDay1), _AddSpace(strYear1));
strFormat2.Format(_T("%s%s%s"), _AddSpace(strMonth2), _AddSpace(strDay2), (LPCTSTR)strYear2);
}
//----------------------------------------------------------------------------
CString strCaption;
if (!CXTPCalendarUtils::IsEqual(dtDay1, dtDay2))
{
strCaption = CXTPCalendarUtils::GetDateFormat(dtDay1, strFormat1);
strCaption += _T("- ");
}
strCaption += CXTPCalendarUtils::GetDateFormat(dtDay2, strFormat2);
return strCaption;
}