📄 bcgpcalendarbar.cpp
字号:
InvalidateRect(rect);
m_nHoldTimerID = SetTimer (nHoldMouseTimerID, m_nElapseInterval = 500, NULL);
}
else
{
CCalendarMonthButton* pmonth = DYNAMIC_DOWNCAST (CCalendarMonthButton, pBtnHit);
if (pmonth != NULL)
{
CRect rect = pmonth->Rect();
OnSelectMonth(pmonth->Rect());
OnChangeHot (-1);
InvalidateRect( rect );
InvalidateRect( pmonth->Rect() );
UpdateWindow(); // immediate feedback
}
}
}
//***************************************************************************************
void CBCGPCalendarBar::OnLButtonUp(UINT nFlags, CPoint point)
{
//Reset capturing if navi and finish timer
if (!IsCustomizeMode () || m_bInternal)
{
if (GetCapture() == this)
{
KillTimer(m_nHoldTimerID);
m_nHoldTimerID = 0;
}
HWND hwndSaved = m_hWnd;
CBCGPToolBar::OnLButtonUp(nFlags, point);
m_iButtonCapture = -1;
if (::IsWindow (hwndSaved) && // "This" may be destoyed now!
m_bIsTearOff)
{
int iPB = m_iHighlighted;
OnChangeHot (-1);
m_iHighlighted = m_iHot;
InvalidateButton(iPB);
if (m_iHighlighted >= 0)
InvalidateButton(m_iHighlighted);
}
}
}
//***************************************************************************************
void CBCGPCalendarBar::OnLButtonDblClk(UINT nFlags, CPoint point)
{
if (!IsCustomizeMode () || m_bInternal)
{
CBCGPToolBar::OnLButtonDblClk(nFlags, point);
}
}
//***************************************************************************************
BOOL CBCGPCalendarBar::PreTranslateMessage(MSG* pMsg)
{
if ((m_pParentBtn != NULL ) && !m_bInCommand)
{
switch (pMsg->message)
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
{
CRect rect;
GetClientRect (rect);
CPoint pt (BCG_GET_X_LPARAM (pMsg->lParam), BCG_GET_Y_LPARAM (pMsg->lParam));
if (!rect.PtInRect (pt))
{
GetParent ()->SendMessage (WM_CLOSE);
return TRUE;
}
}
break;
case WM_SYSKEYDOWN:
case WM_CONTEXTMENU:
GetParent ()->SendMessage (WM_CLOSE);
return TRUE;
case WM_KEYDOWN:
return OnKey(pMsg->wParam);
}
}
else if (m_bIsTearOff)
{
switch (pMsg->message)
{
case WM_KEYDOWN:
return OnKey(pMsg->wParam);
}
}
return CBCGPPopupMenuBar::PreTranslateMessage(pMsg);
}
//*************************************************************************************
void CBCGPCalendarBar::OnDestroy()
{
if (m_pParentBtn != NULL)
{
m_pParentBtn->m_pPopup = NULL;
m_pParentBtn->SetFocus ();
m_pParentBtn->OnHideCalendarPopup();
ReleaseCapture ();
}
CBCGPPopupMenuBar::OnDestroy();
}
//****************************************************************************************
BOOL CBCGPCalendarBar::OnKey(UINT nChar)
{
BOOL isCtrlPressed = (0x8000 & GetKeyState(VK_CONTROL)) != 0;
BOOL isShiftPressed = (0x8000 & GetKeyState(VK_SHIFT)) != 0;
switch (nChar)
{
case VK_HOME:
{
SetDate (COleDateTime::GetCurrentTime());
SelectDay(m_dateSelected, FALSE, FALSE);
Invalidate();
UpdateWindow();
return TRUE;
}
case VK_ESCAPE:
if (m_pParentBtn != NULL)
{
GetParent ()->SendMessage (WM_CLOSE);
return TRUE;
}
break;
case VK_RETURN:
if (m_pParentBtn != NULL)
{
m_pParentBtn->SetDate (m_LastAddedDate);
GetParent ()->SendMessage (WM_CLOSE);
return TRUE;
}
break;
case VK_PRIOR:
if (!isCtrlPressed)
{
int mon = m_dateSelected.GetMonth();
mon --;
if (mon < 1)
mon = 12;
int days = GetMaxMonthDay(COleDateTime(m_dateSelected.GetYear (), mon,
m_dateSelected.GetDay(), 0, 0, 0));
SetDate (m_LastAddedDate - COleDateTimeSpan(days, 0, 0, 0));
Invalidate();
UpdateWindow();
return TRUE;
}
else
{
SetDate (COleDateTime(m_dateSelected.GetYear () - 1, m_dateSelected.GetMonth(),
m_dateSelected.GetDay(), 0, 0, 0));
Invalidate();
UpdateWindow();
return TRUE;
}
case VK_UP:
if (!isCtrlPressed)
{
SelectDay(m_LastAddedDate + COleDateTimeSpan(-7, 0, 0, 0), FALSE, isShiftPressed);
SetDate (m_LastAddedDate);
Invalidate();
UpdateWindow();
}
return TRUE;
case VK_NEXT:
if (!isCtrlPressed)
{
SetDate (m_LastAddedDate + COleDateTimeSpan(GetMaxMonthDay (m_dateSelected), 0, 0, 0));
Invalidate();
UpdateWindow();
return TRUE;
}
else
{
SetDate (COleDateTime(m_dateSelected.GetYear () + 1, m_dateSelected.GetMonth(),
m_dateSelected.GetDay(), 0, 0, 0));
Invalidate();
UpdateWindow();
return TRUE;
}
case VK_DOWN:
if (!isCtrlPressed)
{
SelectDay(m_LastAddedDate + COleDateTimeSpan(7, 0, 0, 0), FALSE, isShiftPressed);
SetDate (m_LastAddedDate);
Invalidate();
UpdateWindow();
}
return TRUE;
case VK_LEFT:
if (!isCtrlPressed)
{
SelectDay(m_LastAddedDate + COleDateTimeSpan(-1, 0, 0, 0), FALSE, isShiftPressed);
SetDate (m_LastAddedDate);
Invalidate();
UpdateWindow();
return TRUE;
}
case VK_RIGHT:
if (!isCtrlPressed)
{
SelectDay(m_LastAddedDate + COleDateTimeSpan(1, 0, 0, 0), FALSE, isShiftPressed);
SetDate (m_LastAddedDate);
Invalidate();
UpdateWindow();
return TRUE;
}
}
return CBCGPPopupMenuBar::OnKey (nChar);
}
//****************************************************************************************
void CBCGPCalendarBar::OnSelectMonth(LPCRECT lpRect)
{
#ifndef DISABLE_MONTH_POPUP
if ((m_styleFlags & CBCGPCalendarBar::CBR_NAVIGATION_BUTTONS) && m_bIsTearOff)
{
CBCGPWorkspace* pWS = GetWorkspace();
if (!pWS)
return;
CMenu menu;
menu.CreatePopupMenu();
for(int i = 0; i < 12; i ++)
{
menu.AppendMenu(MF_STRING, BCGM_SETMONTHFIRST + i, GetMonthName(i + 1));
}
CRect capRect(lpRect);
ClientToScreen(capRect);
int x = capRect.left;
int y = capRect.bottom;
CBCGPPopupMenu monthPopup;
CWnd* pParent = GetParent();
if (pParent)
pParent = pParent->GetParent();
if (!pParent)
pParent = this;
UINT retID = pWS->GetContextMenuManager()->TrackPopupMenu (menu.Detach (), x, y, pParent);
if (retID)
OnMonthMenu(retID);
else
InvalidateRect(lpRect);
}
#endif
}
void CBCGPCalendarBar::OnMonthMenu(UINT id)
{
#ifndef DISABLE_MONTH_POPUP
COleDateTime dt = m_dateSelected;
dt.SetDate (dt.GetYear(), id - BCGM_SETMONTHFIRST + 1, dt.GetDay());
SetDate(dt);
#endif
}
afx_msg LRESULT CBCGPCalendarBar::OnMouseLeave(WPARAM wp,LPARAM lp)
{
if (m_hookMouseHelp != NULL ||
(m_bMenuMode && !IsCustomizeMode () && GetDroppedDownMenu () != NULL))
{
return 0;
}
m_bTracked = FALSE;
m_ptLastMouse = CPoint (-1, -1);
if (m_iHighlighted >= 0)
{
int iButton = m_iHighlighted;
m_iHighlighted = -1;
OnChangeHot (m_iHighlighted);
InvalidateButton (iButton);
UpdateWindow(); // immediate feedback
GetOwner()->SendMessage(WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE);
}
return 0;
}
//****************************************************************************************
void CBCGPCalendarBar::SetVertMargin (int nVertMargin)
{
ASSERT_VALID (this);
m_nVertMargin = nVertMargin;
AdjustLayout ();
}
//*****************************************************************************************
void CBCGPCalendarBar::SetHorzMargin (int nHorzMargin)
{
ASSERT_VALID (this);
m_nHorzMargin = nHorzMargin;
AdjustLayout ();
}
//************************************************************************************
LPCTSTR CBCGPCalendarBar::GetMonthName(int index)
{
ASSERT(index > 0 && index <= 12);
if (m_strMonthNames[0].IsEmpty())
{
CBCGPDefaultLocale dl;
COleDateTime today = COleDateTime::GetCurrentTime();
for (int i = 0; i < 12; i ++)
{
today.SetDate (today.GetYear(), i + 1, 1);
m_strMonthNames[i] = today.Format (_T("%B"));
}
}
if (index > 0 && index <= 12)
{
return m_strMonthNames[index - 1];
}
return NULL;
}
//****************************************************************************************
void CBCGPCalendarBar::SelectWeekday(const COleDateTime& date, BOOL isCtrlPressed, BOOL isShiftPressed)
{
if (!(m_styleFlags & CBR_MULTISELECTION))
return;
int iMonth = m_dateSelected.GetMonth ();
int iYear = m_dateSelected.GetYear ();
int iDaysInMonth = GetMaxMonthDay (m_dateSelected);
int iWeekDay = date.GetDayOfWeek ();
if (!isCtrlPressed && !isShiftPressed)
{
ClearSelectedDays();
}
for (int iDay = 1; iDay <= iDaysInMonth; iDay ++)
{
COleDateTime date (iYear, iMonth, iDay, 0, 0, 0);
if (date.GetDayOfWeek () == iWeekDay)
{
if (!isShiftPressed && IsDaySelected (date))
{
RemoveSelectedDay (iDay);
}
else
{
m_LastAddedDate = date;
AddSelectedDay (iDay);
}
}
}
Invalidate ();
UpdateWindow ();
OnSelectionChanged ();
}
//****************************************************************************************
void CBCGPCalendarBar::SelectWeek(const COleDateTime& date, BOOL isCtrlPressed, BOOL isShiftPressed)
{
if (!(m_styleFlags & CBR_MULTISELECTION))
return;
int iMonth = m_dateSelected.GetMonth ();
int iYear = m_dateSelected.GetYear ();
int iDaysInMonth = GetMaxMonthDay (m_dateSelected);
int iWeekNo = CBCGPCalendarBar::GetWeekNo(date, m_nWeekStart);
if (!isCtrlPressed && !isShiftPressed)
{
ClearSelectedDays();
}
for (int iDay = 1; iDay <= iDaysInMonth; iDay ++)
{
COleDateTime date (iYear, iMonth, iDay, 0, 0, 0);
if ( iWeekNo == CBCGPCalendarBar::GetWeekNo(date, m_nWeekStart))
{
if (!isShiftPressed && IsDaySelected (date))
{
RemoveSelectedDay (iDay);
}
else
{
m_LastAddedDate = date;
AddSelectedDay (iDay);
}
}
}
Invalidate ();
UpdateWindow ();
OnSelectionChanged ();
}
//****************************************************************************************
void CBCGPCalendarBar::SelectDaySequence(const COleDateTime& date)
{
int iFirst = 0, iLast = 0;
int d = date.GetDay ();
for (POSITION pos = m_lstSelectedDays.GetHeadPosition (); pos != NULL; )
{
int i = m_lstSelectedDays.GetNext (pos);
if (!i)
continue;
if (iFirst == 0)
iFirst = i;
if (iLast == 0)
iLast = i;
if (iFirst > i)
iFirst = i;
if (iLast < i)
iLast = i;
}
if (d < iFirst)
{
iFirst = d;
}
else
{
iLast = d;
}
ASSERT(iFirst <= iLast && iFirst > 0);
ClearSelectedDays();
for (int i = iFirst; i <= iLast; i ++)
{
m_LastAddedDate = date;
AddSelectedDay(i);
}
}
//****************************************************************************************
void CBCGPCalendarBar::SelectDay(const COleDateTime& date, BOOL isCtrlPressed, BOOL isShiftPressed)
{
if (!(m_styleFlags & CBR_MULTISELECTION) || !isCtrlPressed && !isShiftPressed)
{
ClearSelectedDays();
m_LastAddedDate = date;
AddSelectedDay (date.GetDay());
}
if (!m_bIsTearOff)
{
m_dateSelected = date;
}
if (date.GetMonth () == m_dateSelected.GetMonth())
//return;
{
if (isCtrlPressed)
{
if (!IsDaySelected(date))
{
m_LastAddedDate = date;
AddSelectedDay (date.GetDay());
}
else
RemoveSelectedDay(date.GetDay());
}
else if (isShiftPressed)
{
SelectDaySequence(date);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -