private void OnDrawBody(PaintEventArgs pevent) { var g = pevent.Graphics; var rc = pevent.ClipRectangle; var iColWidth = rc.Width / DEF_COLUMNS_COUNT; var iRowHeight = (rc.Height - DEF_WEEK_DAY_HEIGHT) / DEF_ROWS_COUNT; #region Top Separator Painter.DrawSeparator(g, new Point(rc.X + 2, rc.Y + DEF_WEEK_DAY_HEIGHT - 3), new Point(rc.Right - 2, rc.Y + DEF_WEEK_DAY_HEIGHT - 3)); #endregion #region Weekday Name var rcHead = new Rectangle(rc.X, rc.Y, iColWidth, DEF_WEEK_DAY_HEIGHT - 3); if (IsRightToLeftCulture) { for (var i = DEF_COLUMNS_COUNT; i > 0; i--) { rcHead.X = rc.Width - (i * iColWidth); DrawDayValue(g, i - 1, rcHead); } } else { for (var i = 0; i < DEF_COLUMNS_COUNT; i++) { rcHead.X = rc.X + (i * iColWidth); DrawDayValue(g, i, rcHead); } } #endregion #region Calculate Month Values //How many days are in DrawTab month and first day of month var numDays = DefaultCalendar.GetDaysInMonth(ViewYear, ViewMonth); var dtStartOfMonth = new DateTime(ViewYear, ViewMonth, 1, 0, 0, 0, DefaultCalendar); var dtStartOfNextMonth = dtStartOfMonth.AddDays(numDays); var firstDay = GetFirstDayOfWeek(dtStartOfMonth); var rowNo = 1; var iLastMonth = ViewMonth; var iLastYear = ViewYear; if (ViewMonth - 1 < 1 && iLastYear > 1) { iLastMonth = 12; iLastYear--; } else if (iLastMonth - 1 > 0) { iLastMonth--; } var prevMonthDays = DefaultCalendar.GetDaysInMonth(iLastYear, iLastMonth); var lastingDays = prevMonthDays - firstDay; var brush = Brushes.Gray; Rectangle rcDay; if (IsRightToLeftCulture) { rcDay = new Rectangle(rcHead.X, rc.Y + DEF_WEEK_DAY_HEIGHT, rcHead.Width - 2, iRowHeight + 1); } else { rcDay = new Rectangle(rc.X, rc.Y + DEF_WEEK_DAY_HEIGHT, rcHead.Width - 2, iRowHeight + 1); } #endregion #region Pre-Day Padding for (var y = lastingDays; y < prevMonthDays; y++) { //Raise the custom-darw event var lastMonthDay = new DateTime(iLastYear, iLastMonth, y + 1, DefaultCalendar); var args = new CustomDrawDayEventArgs(rcDay, g, iLastYear, iLastMonth, y + 1, false, lastMonthDay); OnDrawCurrentDay(args); if (!args.Handled) { //Disabled Days var disabledDay = toFarsi.Convert((y + 1).ToString(), DefaultCulture); g.DrawString(disabledDay, Font, brush, rcDay, OneLineNoTrimming); } if (IsRightToLeftCulture) { rcDay.X = rcDay.X - iColWidth; } else { rcDay.X = rcDay.X + iColWidth; } } #endregion #region Current Day for (var x = 1; x <= numDays; x++) { var dtInPaint = new DateTime(ViewYear, ViewMonth, x, DefaultCalendar); brush = SystemBrushes.WindowText; //draw weekday header names var dayNo = toFarsi.Convert(x.ToString(), DefaultCulture); var index = x; //Selected Days if (IsMultiSelect && (selectedRects.Contains(index) || SelectedDateRange.Contains(dtInPaint))) { if (!ShowFocusRect) { Painter.DrawSelectedPanel(g, rcDay); } else { Painter.DrawFocusRect(g, rcDay); } g.DrawString(dayNo, Font, SystemBrushes.ControlText, rcDay, OneLineNoTrimming); AddActiveRect(rcDay, FocusedPart.MonthDay, index); } else if (SelectedDay == x) //Current Day { AddActiveRect(rcDay, FocusedPart.MonthDay, index); var args = new CustomDrawDayEventArgs(rcDay, g, ViewYear, ViewMonth, x, true, dtInPaint); OnDrawCurrentDay(args); if (!args.Handled) { if (!IsNull && !ShowFocusRect) { Painter.DrawSelectedPanel(g, rcDay); } else if (!IsNull && ShowFocusRect) { Painter.DrawFocusRect(g, rcDay); } else if (IsNull) { Painter.DrawSelectionBorder(g, rcDay); } g.DrawString(dayNo, Font, SystemBrushes.ControlText, rcDay, OneLineNoTrimming); } } else //Other Days { AddActiveRect(rcDay, FocusedPart.MonthDay, index); var args = new CustomDrawDayEventArgs(rcDay, g, ViewYear, ViewMonth, x, false, dtInPaint); OnDrawCurrentDay(args); if (!args.Handled) { g.DrawString(dayNo, Font, brush, rcDay, OneLineNoTrimming); } } if (IsRightToLeftCulture) { rcDay.X = rcDay.X - iColWidth; if (rcDay.X < 0) { rowNo++; rcDay.X = rcHead.X; rcDay.Y = rcDay.Y + iRowHeight + DEF_ROWS_MARGIN; } } else { rcDay.X = rcDay.X + iColWidth; if (rcDay.X > rc.Width - rcDay.Width) { rowNo++; rcDay.X = rc.X; rcDay.Y = rcDay.Y + iRowHeight + DEF_ROWS_MARGIN; } } } #endregion #region Post-Day Padding //Draw next month starting days as disabled int endDay; brush = Brushes.Gray; if (firstDay != 0) { endDay = numDays + 1; } else { endDay = numDays; } for (var i = endDay; i < 42; i++) { if (rowNo > 6) break; var dayNo = i - endDay + 1; var nextDay = DefaultCalendar.GetDayOfMonth(dtStartOfNextMonth); var nextMonth = DefaultCalendar.GetMonth(dtStartOfNextMonth); var nextYear = DefaultCalendar.GetYear(dtStartOfNextMonth); var args = new CustomDrawDayEventArgs(rcDay, g, nextYear, nextMonth, nextDay, false, dtStartOfNextMonth); OnDrawCurrentDay(args); if (!args.Handled) { var disabledDay = toFarsi.Convert(dayNo.ToString(), DefaultCulture); g.DrawString(disabledDay, Font, brush, rcDay, OneLineNoTrimming); } if (IsRightToLeftCulture) { rcDay.X = rcDay.X - iColWidth; if (rcDay.X < 0) { rowNo++; rcDay.X = rcHead.X; rcDay.Y = rcDay.Y + iRowHeight + DEF_ROWS_MARGIN; } } else { rcDay.X = rcDay.X + iColWidth; if (rcDay.X > rc.Width - rcDay.Width) { rowNo++; rcDay.X = rc.X; rcDay.Y = rcDay.Y + iRowHeight + DEF_ROWS_MARGIN; } } dtStartOfNextMonth = dtStartOfNextMonth.AddDays(1); } #endregion }
protected virtual void OnDrawCurrentDay(CustomDrawDayEventArgs e) { if (DrawCurrentDay != null) DrawCurrentDay(this, e); }
private void faMonthView_DrawCurrentDay(object sender, CustomDrawDayEventArgs e) { //Remember to set IsHandled = true if you're doing the drawings, unless //the control will overpaint on your job. if(e.Year == 1384 && e.Month == 4 && e.Day == 8) { using(SolidBrush br1 = new SolidBrush(Color.Wheat)) using(LinearGradientBrush br2 = new LinearGradientBrush(e.Rectangle, Color.DeepSkyBlue, Color.DarkSlateBlue, 45, true)) using(StringFormat fmt = new StringFormat()) using(Font font = new Font("Tahoma", 8, FontStyle.Bold)) { string dayNo = toFarsi.Convert(e.Day.ToString()); fmt.Alignment = StringAlignment.Center; fmt.LineAlignment = StringAlignment.Center; e.Graphics.FillRectangle(br2, e.Rectangle); e.Graphics.DrawString(dayNo, font, br1, e.Rectangle, fmt); if(e.IsToday) faMonthView.Painter.DrawFocusRect(e.Graphics, e.Rectangle); } e.Handled = true; } else if(e.Month == 1 && e.Day == 1) { using(SolidBrush br1 = new SolidBrush(Color.Black)) using(SolidBrush br2 = new SolidBrush(Color.DarkSeaGreen)) using(StringFormat fmt = new StringFormat()) using(Pen p = new Pen(Color.DarkGreen)) using(Font font = new Font("Tahoma", 9, FontStyle.Italic)) { string dayNo = toFarsi.Convert(e.Day.ToString()); fmt.Alignment = StringAlignment.Center; fmt.LineAlignment = StringAlignment.Center; e.Graphics.FillRectangle(br2, e.Rectangle); e.Graphics.DrawString(dayNo, font, br1, e.Rectangle, fmt); e.Graphics.DrawRectangle(p, e.Rectangle); } e.Handled = true; } else if(e.Date.DayOfWeek == DayOfWeek.Friday) { using(Pen p = new Pen(Color.Red)) using(SolidBrush br = new SolidBrush(Color.Red)) using(Font font = new Font("Tahoma", 9, FontStyle.Bold)) using (StringFormat fmt = new StringFormat()) { string dayNo = toFarsi.Convert(e.Day.ToString()); fmt.Alignment = StringAlignment.Center; fmt.LineAlignment = StringAlignment.Center; e.Graphics.DrawString(dayNo, font, br, e.Rectangle, fmt); e.Handled = true; } } }