/// <summary> /// Raises the <see cref="System.Windows.Forms.Control.Paint"/> event. /// </summary> /// <param name="e">A <see cref="PaintEventArgs"/> that contains the event data.</param> protected override void OnPaint(PaintEventArgs e) { if (this.inEditMode) { e.Graphics.Clear(this.BackColor); base.OnPaint(e); return; } e.Graphics.Clear(this.Enabled ? (this.isValidDate ? this.BackColor : this.invalidDateBackColor) : SystemColors.Window); using (StringFormat format = new StringFormat(StringFormatFlags.LineLimit | StringFormatFlags.NoClip | StringFormatFlags.NoWrap)) { format.LineAlignment = StringAlignment.Center; if (this.RightToLeft == RightToLeft.Yes) { format.Alignment = StringAlignment.Far; } using (SolidBrush foreBrush = new SolidBrush(this.Enabled ? (this.isValidDate ? this.ForeColor : this.invalidDateForeColor) : SystemColors.GrayText), selectedBrush = new SolidBrush(SystemColors.HighlightText), selectedBack = new SolidBrush(SystemColors.Highlight)) { MonthCalendar cal = this.datePicker.Picker; ICustomFormatProvider provider = cal.FormatProvider; MonthCalendarDate date = new MonthCalendarDate(cal.CultureCalendar, this.currentDate); DatePatternParser parser = new DatePatternParser(provider.ShortDatePattern, provider); string dateString = parser.ParsePattern(date, this.datePicker.UseNativeDigits ? this.datePicker.Culture.NumberFormat.NativeDigits : null); this.dayPartIndex = parser.DayPartIndex; this.monthPartIndex = parser.MonthPartIndex; this.yearPartIndex = parser.YearPartIndex; List<CharacterRange> rangeList = new List<CharacterRange>(); int dayIndex = parser.DayIndex; int monthIndex = parser.MonthIndex; int yearIndex = parser.YearIndex; if (!string.IsNullOrEmpty(parser.DayString)) { rangeList.Add(new CharacterRange(dayIndex, parser.DayString.Length)); } if (!string.IsNullOrEmpty(parser.MonthString)) { rangeList.Add(new CharacterRange(monthIndex, parser.MonthString.Length)); } if (!string.IsNullOrEmpty(parser.YearString)) { rangeList.Add(new CharacterRange(yearIndex, parser.YearString.Length)); } format.SetMeasurableCharacterRanges(rangeList.ToArray()); Rectangle layoutRect = this.ClientRectangle; e.Graphics.DrawString(dateString, this.Font, foreBrush, layoutRect, format); Region[] dateRegions = e.Graphics.MeasureCharacterRanges(dateString, this.Font, layoutRect, format); this.dayBounds = dateRegions[0].GetBounds(e.Graphics); this.monthBounds = dateRegions[1].GetBounds(e.Graphics); this.yearBounds = dateRegions[2].GetBounds(e.Graphics); if (this.selectedPart == SelectedDatePart.Day) { e.Graphics.FillRectangle(selectedBack, this.dayBounds.X, this.dayBounds.Y - 2, this.dayBounds.Width + 1, this.dayBounds.Height + 1); e.Graphics.DrawString(parser.DayString, this.Font, selectedBrush, this.dayBounds.X - 2, this.dayBounds.Y - 2); } if (this.selectedPart == SelectedDatePart.Month) { e.Graphics.FillRectangle(selectedBack, this.monthBounds.X, this.monthBounds.Y - 2, this.monthBounds.Width + 1, this.monthBounds.Height + 1); e.Graphics.DrawString(parser.MonthString, this.Font, selectedBrush, this.monthBounds.X - 2, this.monthBounds.Y - 2); } if (this.selectedPart == SelectedDatePart.Year) { e.Graphics.FillRectangle(selectedBack, this.yearBounds.X, this.yearBounds.Y - 2, this.yearBounds.Width + 1, this.yearBounds.Height + 1); e.Graphics.DrawString(parser.YearString, this.Font, selectedBrush, this.yearBounds.X - 2, this.yearBounds.Y - 2); } } } base.OnPaint(e); }
/// <summary> /// Raises the <see cref="System.Windows.Forms.Control.Paint"/> event. /// </summary> /// <param name="e">A <see cref="PaintEventArgs"/> that contains the event data.</param> protected override void OnPaint(PaintEventArgs e) { if (this.inEditMode) { e.Graphics.Clear(this.BackColor); base.OnPaint(e); return; } e.Graphics.Clear(this.Enabled ? (this.isValidDate ? this.BackColor : this.invalidDateBackColor) : SystemColors.Window); using (StringFormat format = new StringFormat(StringFormatFlags.LineLimit | StringFormatFlags.NoClip | StringFormatFlags.NoWrap)) { format.LineAlignment = StringAlignment.Center; if (this.RightToLeft == RightToLeft.Yes) { format.Alignment = StringAlignment.Far; } using (SolidBrush foreBrush = new SolidBrush(this.Enabled ? (this.isValidDate ? this.ForeColor : this.invalidDateForeColor) : SystemColors.GrayText), selectedBrush = new SolidBrush(SystemColors.HighlightText), selectedBack = new SolidBrush(SystemColors.Highlight)) { MonthCalendar cal = this.datePicker.Picker; ICustomFormatProvider provider = cal.FormatProvider; MonthCalendarDate date = new MonthCalendarDate(cal.CultureCalendar, this.currentDate); DatePatternParser parser = new DatePatternParser(provider.ShortDatePattern, provider); string dateString = parser.ParsePattern(date, this.datePicker.UseNativeDigits ? this.datePicker.Culture.NumberFormat.NativeDigits : null); this.dayPartIndex = parser.DayPartIndex; this.monthPartIndex = parser.MonthPartIndex; this.yearPartIndex = parser.YearPartIndex; List <CharacterRange> rangeList = new List <CharacterRange>(); int dayIndex = parser.DayIndex; int monthIndex = parser.MonthIndex; int yearIndex = parser.YearIndex; if (!string.IsNullOrEmpty(parser.DayString)) { rangeList.Add(new CharacterRange(dayIndex, parser.DayString.Length)); } if (!string.IsNullOrEmpty(parser.MonthString)) { rangeList.Add(new CharacterRange(monthIndex, parser.MonthString.Length)); } if (!string.IsNullOrEmpty(parser.YearString)) { rangeList.Add(new CharacterRange(yearIndex, parser.YearString.Length)); } format.SetMeasurableCharacterRanges(rangeList.ToArray()); Rectangle layoutRect = this.ClientRectangle; e.Graphics.DrawString(dateString, this.Font, foreBrush, layoutRect, format); Region[] dateRegions = e.Graphics.MeasureCharacterRanges(dateString, this.Font, layoutRect, format); this.dayBounds = dateRegions[0].GetBounds(e.Graphics); this.monthBounds = dateRegions[1].GetBounds(e.Graphics); this.yearBounds = dateRegions[2].GetBounds(e.Graphics); if (this.selectedPart == SelectedDatePart.Day) { e.Graphics.FillRectangle(selectedBack, this.dayBounds.X, this.dayBounds.Y - 2, this.dayBounds.Width + 1, this.dayBounds.Height + 1); e.Graphics.DrawString(parser.DayString, this.Font, selectedBrush, this.dayBounds.X - 2, this.dayBounds.Y - 2); } if (this.selectedPart == SelectedDatePart.Month) { e.Graphics.FillRectangle(selectedBack, this.monthBounds.X, this.monthBounds.Y - 2, this.monthBounds.Width + 1, this.monthBounds.Height + 1); e.Graphics.DrawString(parser.MonthString, this.Font, selectedBrush, this.monthBounds.X - 2, this.monthBounds.Y - 2); } if (this.selectedPart == SelectedDatePart.Year) { e.Graphics.FillRectangle(selectedBack, this.yearBounds.X, this.yearBounds.Y - 2, this.yearBounds.Width + 1, this.yearBounds.Height + 1); e.Graphics.DrawString(parser.YearString, this.Font, selectedBrush, this.yearBounds.X - 2, this.yearBounds.Y - 2); } } } base.OnPaint(e); }