private void UpdateMonthSize() { //One row of day names plus 31 possible numbers string[] strs = new string[7 + 31]; int maxWidth = 0; int maxHeight = 0; for (int i = 0; i < 7; i++) { strs[i] = ViewStart.AddDays(i).ToString(DayNamesFormat).Substring(0, DayNamesLength); } for (int i = 7; i < strs.Length; i++) { strs[i] = (i - 6).ToString(); } Font f = new Font(Font, FontStyle.Bold); for (int i = 0; i < strs.Length; i++) { Size s = TextRenderer.MeasureText(strs[i], f); maxWidth = Math.Max(s.Width, maxWidth); maxHeight = Math.Max(s.Height, maxHeight); } maxWidth += ItemPadding.Horizontal; maxHeight += ItemPadding.Vertical; _daySize = new Size(maxWidth, maxHeight); _monthSize = new Size(maxWidth * 7, maxHeight * 7 + maxHeight * (DayNamesVisible ? 1 : 0)); }
/// <summary> /// Updates the /// </summary> private void UpdateDaysAndWeeks() { TimeSpan span = (new DateTime(ViewEnd.Year, ViewEnd.Month, ViewEnd.Day, 23, 59, 59)).Subtract(ViewStart.Date); int preDays = 0; span = span.Add(new TimeSpan(0, 0, 0, 1, 0)); if (span.Days < 1 || span.Days > MaximumViewDays) { throw new Exception("Days between ViewStart and ViewEnd should be between 1 and MaximumViewDays"); } if (span.Days > MaximumFullDays) { SetDaysMode(CalendarDaysMode.Short); preDays = (new int[] { 0, 1, 2, 3, 4, 5, 6 })[(int)ViewStart.DayOfWeek] - (int)FirstDayOfWeek; span = span.Add(new TimeSpan(preDays, 0, 0, 0)); while (span.Days % 7 != 0) { span = span.Add(new TimeSpan(1, 0, 0, 0)); } } else { SetDaysMode(CalendarDaysMode.Expanded); } _days = new CalendarDay[span.Days]; for (int i = 0; i < Days.Length; i++) { Days[i] = new CalendarDay(this, ViewStart.AddDays(-preDays + i), i); } //Weeks if (DaysMode == CalendarDaysMode.Short) { List <CalendarWeek> weeks = new List <CalendarWeek>(); for (int i = 0; i < Days.Length; i++) { if (Days[i].Date.DayOfWeek == FirstDayOfWeek) { weeks.Add(new CalendarWeek(this, Days[i].Date)); } } _weeks = weeks.ToArray(); } else { _weeks = new CalendarWeek[] { }; } UpdateHighlights(); }
/// <summary> /// Scrolls the calendar using the specified delta /// </summary> /// <param name="delta"></param> private void ScrollCalendar(int delta) { if (delta < 0) { SetViewRange(ViewStart.AddDays(7), ViewEnd.AddDays(7)); } else { SetViewRange(ViewStart.AddDays(-7), ViewEnd.AddDays(-7)); } }