Inheritance: CustomDrawEventArgs
Esempio n. 1
0
        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
        }
Esempio n. 2
0
 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;
                }
            }
        }