using HotelPms.Share.Windows.Util; using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; using System.Windows.Forms.VisualStyles; namespace HotelPms.Share.Windows.Component { /// /// コピーだけ、全く書いてない /// テスト /// public class Calendar : System.Windows.Forms.Control { #region ★★★★★ Declartions ★★★★★ public enum ShowStyleType : int { TreeMonth = 0, OneMonth, } public enum HitType : int { None = 0, YearPrev, MonthPrev, CurrentDay, MonthNext, YearNext, Day, } public enum LanguageType : int { Japanese = 0, Chinese, English, } public enum DayStyleType : int { Row4 = 0, Row3, } public sealed class HitTestInfo { public static readonly HitTestInfo Nowhere; internal int y; internal int x; internal string value = string.Empty; internal HitType type; static HitTestInfo() { HitTestInfo.Nowhere = new HitTestInfo(); } internal HitTestInfo() { this.type = HitType.None; this.x = -1; this.y = -1; } public string Value { get { return value; } } public int X { get { return this.x; } } public int Y { get { return this.y; } } public HitType Type { get { return this.type; } } public override int GetHashCode() { return this.x << 16 | this.y << 8 | (int)this.type; } public override bool Equals(object obj) { HitTestInfo hi = obj as HitTestInfo; return (this.type == hi.type && this.x == hi.x && this.x == hi.x); } public override string ToString() { return string.Concat(new string[7] { "{ ", this.type.ToString(), ",", this.x.ToString(), ",", this.y.ToString(), "}" }); } } private static string[] weekShortNamesCn = new string[] { "日", "一", "二", "三", "四", "五", "六" }; private static string[] weekShortNamesJp = new string[] { "日", "月", "火", "水", "木", "金", "土" }; private static string[] weekShortNamesEn = new string[] { "S", "M", "T", "W", "T", "F", "S" }; private static string[] ButtonBarText = new string[] { "<<", "<", "〇", ">", ">>" }; private StringFormat m_StringFormat = new StringFormat(StringFormatFlags.NoWrap); private StringFormat m_StringFormatLeft = new StringFormat(StringFormatFlags.NoWrap); private static int colCount = 35; //幅35セル単位 private static int dayWidth = 5; //5セル単位(固定) private static int dayHeight = 4; //4セル単位,3セル単位可能 private static int dayLineCount = 6; //6行 private int headerRowCount = 9; //Topカレンダーの高さ private int changeBarRowCount = 2; //年月調整バー private int weekRowCount = 2; //週のタイトル private int rowCount = 0; private float cellHeight = 0; private float cellWidth = 0; private bool m_MouseFocused = false; private bool m_MouseDown = false; private HitType currHitType = HitType.None; private string currHitValue = string.Empty; private RectangleF headerCenterRect; private List buttonRectList = new List(); private SortedList dayRectList = new SortedList(); private DateTime showValue = DateTime.Now; public event CalendarEventHandler DayCellFormat; public event CalendarEventHandler DateSelect; #endregion #region ★★★★★ Property ★★★★★ #region カレンダー(年月日) private Font yearFont = new Font("メイリオ", 14F); [Description("年のフォント"), Category("Calendar Action(TopCenter)")] public Font YearFont { get { return yearFont; } set { yearFont = value; Invalidate(); } } private Color yearForeColor = Color.Purple; [Description("年のフォント色"), Category("Calendar Action(TopCenter)")] public Color YearForeColor { get { return yearForeColor; } set { yearForeColor = value; Invalidate(); } } private Font monthFont = new Font("メイリオ", 36F); [Description("月のフォント"), Category("Calendar Action(TopCenter)")] public Font MonthFont { get { return monthFont; } set { monthFont = value; Invalidate(); } } private Color monthForeColor = Color.Purple; [Description("月のフォント色"), Category("Calendar Action(TopCenter)")] public Color MonthForeColor { get { return monthForeColor; } set { monthForeColor = value; Invalidate(); } } private Font selectDateFont = new Font("メイリオ", 12F); [Description("選択された日のフォント"), Category("Calendar Action(TopCenter)")] public Font SelectDateFont { get { return selectDateFont; } set { selectDateFont = value; Invalidate(); } } private Color selectDateForeColor = Color.Navy; [Description("選択された日のフォント色"), Category("Calendar Action(TopCenter)")] public Color SelectDateForeColor { get { return selectDateForeColor; } set { selectDateForeColor = value; Invalidate(); } } #endregion #region カレンダー(ボタン) private Font buttonFont = new Font("メイリオ", 12F); [Description("ボタンのフォント"), Category("Calendar Action(Button)")] public Font ButtonFont { get { return buttonFont; } set { buttonFont = value; Invalidate(); } } private Color buttonForeColor = Color.White; [Description("ボタンのフォント色"), Category("Calendar Action(Button)")] public Color ButtonForeColor { get { return buttonForeColor; } set { buttonForeColor = value; Invalidate(); } } private Color buttonBackColor = Color.FromArgb(64, 64, 64); [Description("ボタンの背景色"), Category("Calendar Action(Button)")] public Color ButtonBackColor { get { return buttonBackColor; } set { buttonBackColor = value; Invalidate(); } } private Color buttonOverColor = Color.Gray; [Description("ボタンのマウス移動色"), Category("Calendar Action(Button)")] public Color ButtonOverColor { get { return buttonOverColor; } set { buttonOverColor = value; Invalidate(); } } private Color buttonDownColor = Color.Black; [Description("ボタンのマウス押した色"), Category("Calendar Action(Button)")] public Color ButtonDownColor { get { return buttonDownColor; } set { buttonDownColor = value; Invalidate(); } } #endregion #region カレンダー(当月) private DayStyleType dayStyle = DayStyleType.Row4; [Description("日付セルスタイル"), Category("Calendar Action(Current Month)")] public DayStyleType DayStyle { get { return dayStyle; } set { dayStyle = value; dayHeight = dayStyle == DayStyleType.Row4 ? 4 : 3; Invalidate(); } } private Font weekFont = new Font("メイリオ", 10F); [Description("曜日表記のフォント"), Category("Calendar Action(Current Month)")] public Font WeekFont { get { return weekFont; } set { weekFont = value; Invalidate(); } } private Color weekForeColor = Color.White; [Description("曜日のフォント色"), Category("Calendar Action(Current Month)")] public Color WeekForeColor { get { return weekForeColor; } set { weekForeColor = value; Invalidate(); } } private Color weekBackColor = Color.FromArgb(0, 192, 0); [Description("曜日の背景色"), Category("Calendar Action(Current Month)")] public Color WeekBackColor { get { return weekBackColor; } set { weekBackColor = value; Invalidate(); } } private Color selDayBackColor = Color.FromArgb(192, 255, 192); [Description("選択された日付セルの背景色"), Category("Calendar Action(Current Month)")] public Color SelDayBackColor { get { return selDayBackColor; } set { selDayBackColor = value; Invalidate(); } } private Color dayBackColor = Color.FromArgb(255, 245, 210); [Description("日付セルの背景色"), Category("Calendar Action(Current Month)")] public Color DayBackColor { get { return dayBackColor; } set { dayBackColor = value; Invalidate(); } } private Color dayOverColor = Color.FromArgb(192, 255, 255); [Description("日付セルのマウス移動色"), Category("Calendar Action(Current Month)")] public Color DayOverColor { get { return dayOverColor; } set { dayOverColor = value; Invalidate(); } } private Color dayDownColor = Color.FromArgb(0, 192, 0); [Description("日付セルのマウス押した色"), Category("Calendar Action(Current Month)")] public Color DayDownColor { get { return dayDownColor; } set { dayDownColor = value; Invalidate(); } } private Font dayFont = new Font("メイリオ", 14F); [Description("日付のフォント"), Category("Calendar Action(Current Month)")] public Font DayFont { get { return dayFont; } set { dayFont = value; Invalidate(); } } private Color dayForeColor = Color.Black; [Description("日付のフォント色"), Category("Calendar Action(Current Month)")] public Color DayForeColor { get { return dayForeColor; } set { dayForeColor = value;Invalidate();} } private Font rokuyouFont = new Font("メイリオ", 8F); [Description("六曜のフォント調整"), Category("Calendar Action(Current Month)")] public Font RokuyouFont { get { return rokuyouFont; } set { rokuyouFont = value; Invalidate(); } } private bool rokuyouVisible = true; [Description("六曜の表示・非表示"), Category("Calendar Action(Current Month)")] public bool RokuyouVisible { get { return rokuyouVisible; } set { rokuyouVisible = value; Invalidate(); } } private Color rokuyouForeColor = Color.FromArgb(0, 64, 0); [Description("六曜のフォント色"), Category("Calendar Action(Current Month)")] public Color RokuyouForeColor { get { return rokuyouForeColor; } set { rokuyouForeColor = value; Invalidate(); } } private Font holidayFont = new Font("メイリオ", 7F); [Description("祝日のフォント調整"), Category("Calendar Action(Current Month)")] public Font HolidayFont { get { return holidayFont; } set { holidayFont = value; Invalidate(); } } private Color memoForeColor = Color.Black; [Description("メモのフォント色"), Category("Calendar Action(Current Month)")] public Color MemoForeColor { get { return memoForeColor; } set { memoForeColor = value; Invalidate(); } } private Font memoFont = new Font("メイリオ", 9F); [Description("メモのフォント調整"), Category("Calendar Action(Current Month)")] public Font MemoFont { get { return memoFont; } set { memoFont = value; Invalidate(); } } private Color holidayForeColor = Color.Red; [Description("祝日のフォント色"), Category("Calendar Action(Current Month)")] public Color HolidayForeColor { get { return holidayForeColor; } set { holidayForeColor = value; Invalidate(); } } #endregion #region カレンダー(Small) private Font smallYearFont = new Font("メイリオ", 12F); [Description("年月のフォント"), Category("Calendar Action(Small)")] public Font SmallYearFont { get { return smallYearFont; } set { smallYearFont = value; Invalidate(); } } private Color smallYearForeColor = Color.Black; [Description("年月のフォント色"), Category("Calendar Action(Small)")] public Color SmallYearForeColor { get { return smallYearForeColor; } set { smallYearForeColor = value; Invalidate(); } } private Font smallFont = new Font("メイリオ", 7F); [Description("小さい日付のフォント調整"), Category("Calendar Action(Small)")] public Font SmallFont { get { return smallFont; } set { smallFont = value; Invalidate(); } } #endregion private ShowStyleType showStyle = ShowStyleType.TreeMonth; [Description("表示形式"), Category("Calendar Action")] public ShowStyleType ShowStyle { get { return showStyle; } set { showStyle = value; Invalidate(); } } private LanguageType language = LanguageType.Japanese; [Description("言語"), Category("Calendar Action")] public LanguageType Language { get { return language; } set { language = value; Invalidate(); } } private string format = "yyyy/MM/dd"; [Description("Format 例:yyyy/MM/dd"), Category("Calendar Action")] public string Format { get { return format; } set { format = value; if (format.Length == 0) { format = "yyyy/MM/dd"; } Invalidate(); } } private DateTime dateValue = DateTime.Now.Date; [Description("選択された日付"), Category("Calendar Action")] public DateTime Value { get { return dateValue; } set { dateValue = value; showValue = dateValue; Invalidate(); } } public override string Text { get { return Value.ToString(Format); } } #endregion #region ★★★★★ Class Event ★★★★★ public Calendar() { SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | ControlStyles.Opaque | ControlStyles.UserPaint | ControlStyles.DoubleBuffer | ControlStyles.Selectable | ControlStyles.UserMouse, true); m_StringFormat.Alignment = StringAlignment.Center; m_StringFormat.LineAlignment = StringAlignment.Center; m_StringFormatLeft.Alignment = StringAlignment.Near; m_StringFormatLeft.LineAlignment = StringAlignment.Center; } protected override void Dispose(bool disposing) { m_StringFormatLeft.Dispose(); m_StringFormat.Dispose(); base.Dispose(disposing); } #endregion #region ★★★★★ Control Event ★★★★★ protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); try { if (ShowStyle == ShowStyleType.OneMonth) { headerRowCount = 2; } rowCount = headerRowCount + changeBarRowCount + weekRowCount + dayHeight * dayLineCount; cellWidth = (ClientRectangle.Width - 1 - Padding.Left - Padding.Right) * 1.0F / colCount; cellHeight = (ClientRectangle.Height - 1 - Padding.Top - Padding.Bottom) * 1.0F / rowCount; //印字領域 Rectangle rect = new Rectangle(new Point(Padding.Left, Padding.Top), new Size(ClientRectangle.Width - 1 - Padding.Left - Padding.Right, ClientRectangle.Height - 1 - Padding.Top - Padding.Bottom)); e.Graphics.Clear(BackColor); using (Brush textBrush = new SolidBrush(ForeColor)) { if (ShowStyle == ShowStyleType.TreeMonth) { DrawSmall(rect.Left, rect.Top, -1, e.Graphics, textBrush); //前月 DrawHeaderCenter(rect.Left + cellWidth * 14, rect.Top, e.Graphics, textBrush); DrawSmall(rect.Left + rect.Width - cellWidth * 14, rect.Top, 1, e.Graphics, textBrush); //来月 } else { DrawHeaderOneMonth(rect.Left, rect.Top, e.Graphics, textBrush); } DrawButtonBar(rect.Left, rect.Top + cellHeight * headerRowCount, e.Graphics, textBrush); //ボタンバー DrawNormal(rect.Left, rect.Top + cellHeight * (headerRowCount + changeBarRowCount), e.Graphics, textBrush); //カレンダー } } catch { } } private string GetWeekShortName(int index) { return Language == LanguageType.Japanese ? weekShortNamesJp[index] : Language == LanguageType.Chinese ? weekShortNamesCn[index] : weekShortNamesEn[index]; } private void DrawHeaderOneMonth(float x, float y, Graphics g, Brush textBrush) { headerCenterRect = new RectangleF(new PointF(x, y), new SizeF(cellWidth * colCount, cellHeight * headerRowCount)); g.DrawRectangle(Pens.Black, headerCenterRect.X, headerCenterRect.Y, headerCenterRect.Width, headerCenterRect.Height); //表示の年 bool isNewColor = YearForeColor.IsSystemColor; Brush brush = isNewColor ? SystemBrushes.FromSystemColor(YearForeColor) : new SolidBrush(YearForeColor); RectangleF rect = new RectangleF(new PointF(x, y), new SizeF(cellWidth * 18, cellHeight * headerRowCount)); g.DrawString(showValue.ToString("yyyy年MM月"), YearFont, brush, rect, m_StringFormat); if (isNewColor) { brush.Dispose(); } ////表示の月 //isNewColor = MonthForeColor.IsSystemColor; //brush = isNewColor ? SystemBrushes.FromSystemColor(MonthForeColor) : new SolidBrush(MonthForeColor); //rect = new RectangleF(new PointF(x + cellWidth * 9, y), new SizeF(cellWidth * 9, cellHeight * headerRowCount)); //g.DrawString(showValue.Month.ToString() + "月", MonthFont, brush, rect, m_StringFormat); //if (isNewColor) { brush.Dispose(); } //現在の利用日 isNewColor = SelectDateForeColor.IsSystemColor; brush = isNewColor ? SystemBrushes.FromSystemColor(SelectDateForeColor) : new SolidBrush(SelectDateForeColor); rect = new RectangleF(new PointF(x + cellWidth * 18, y), new SizeF(cellWidth * 17, cellHeight * headerRowCount)); g.DrawString(Text, SelectDateFont, brush, rect, m_StringFormat); if (isNewColor) { brush.Dispose(); } } private void DrawHeaderCenter(float x, float y, Graphics g, Brush textBrush) { headerCenterRect = new RectangleF(new PointF(x, y), new SizeF(cellWidth * 7, cellHeight * 9)); g.DrawRectangle(Pens.Black, headerCenterRect.X, headerCenterRect.Y, headerCenterRect.Width, headerCenterRect.Height); //表示の年 bool isNewColor = YearForeColor.IsSystemColor; Brush brush = isNewColor ? SystemBrushes.FromSystemColor(YearForeColor) : new SolidBrush(YearForeColor); RectangleF rect = new RectangleF(new PointF(x, y), new SizeF(cellWidth * 7, cellHeight * 2)); g.DrawString(showValue.Year.ToString(), YearFont, brush, rect, m_StringFormat); if(isNewColor) { brush.Dispose(); } //表示の月 isNewColor = MonthForeColor.IsSystemColor; brush = isNewColor ? SystemBrushes.FromSystemColor(MonthForeColor) : new SolidBrush(MonthForeColor); rect = new RectangleF(new PointF(x, y + cellHeight * 2), new SizeF(cellWidth * 7, cellHeight * 5)); g.DrawString(showValue.Month.ToString(), MonthFont, brush, rect, m_StringFormat); if (isNewColor) { brush.Dispose(); } //現在の利用日 isNewColor = SelectDateForeColor.IsSystemColor; brush = isNewColor ? SystemBrushes.FromSystemColor(SelectDateForeColor) : new SolidBrush(SelectDateForeColor); rect = new RectangleF(new PointF(x, y + cellHeight * 7), new SizeF(cellWidth * 7, cellHeight * 2)); g.DrawString(Text, SelectDateFont, brush, rect, m_StringFormat); if (isNewColor) { brush.Dispose(); } } //yearPrevRect, yearNextRect, monthPrevRect, monthNextRect, dayRect private void DrawButtonBar(float x, float y, Graphics g, Brush textBrush) { buttonRectList.Clear(); RectangleF rect = new RectangleF(new PointF(x, y), new SizeF(cellWidth * 7, cellHeight * 2)); buttonRectList.Add(rect); for (int i= 0; i< 5; i++ ) { if (i > 0) { rect = new RectangleF(new PointF(rect.Left + rect.Width, y), new SizeF(cellWidth * 7, cellHeight * 2)); buttonRectList.Add(rect); } Color hitColor = m_MouseDown && !ButtonDownColor.IsEmpty ? buttonDownColor : !ButtonOverColor.IsEmpty ? ButtonOverColor : ControlPaint.Light(ButtonBackColor.IsEmpty ? BackColor : ButtonBackColor); using (Brush brush = (HitType)(i + 1) == currHitType ? new SolidBrush(hitColor) : new SolidBrush(ButtonBackColor.IsEmpty ? BackColor : ButtonBackColor)) { g.FillRectangle(brush, rect); } g.DrawRectangle(Pens.Black, rect.X, rect.Y, rect.Width, rect.Height); bool isNewColor = ButtonForeColor.IsSystemColor; Brush foreBrush = isNewColor ? SystemBrushes.FromSystemColor(ButtonForeColor) : new SolidBrush(ButtonForeColor); g.DrawString(ButtonBarText[i], ButtonFont, foreBrush, rect, m_StringFormat); if(isNewColor) { foreBrush.Dispose(); } } } /// /// 前月、来月の小さいカレンダーを描く /// private void DrawSmall(float x, float y, int type, Graphics g, Brush textBrush) { //年-月 RectangleF rect = new RectangleF(new PointF(x, y), new SizeF(cellWidth * 14, cellHeight * 2)); DateTime firstDate = DateTime.Parse(showValue.AddMonths(type).ToString("yyyy/MM") + "/01"); g.DrawRectangle(Pens.Black, rect.X, rect.Y, rect.Width, rect.Height); bool isNewColor = SmallYearForeColor.IsSystemColor; Brush foreBrush = isNewColor ? SystemBrushes.FromSystemColor(SmallYearForeColor) : new SolidBrush(SmallYearForeColor); g.DrawString(language == LanguageType.English ? firstDate.ToString("yyyy/MM") : firstDate.ToString("yyyy年MM月"), SmallYearFont, foreBrush, rect, m_StringFormatLeft); if (isNewColor) { foreBrush.Dispose(); } //週のタイトル int firstWeek = (int)firstDate.DayOfWeek; float curY = y + rect.Height; rect = new RectangleF(new PointF(x, curY), new SizeF(cellWidth * 2, cellHeight)); for (int i = 0; i < 7; i++) { g.DrawRectangle(Pens.Black, rect.X, rect.Y, rect.Width, rect.Height); g.DrawString(GetWeekShortName(i), smallFont, i == (int)DayOfWeek.Sunday ? Brushes.Red : i == (int)DayOfWeek.Saturday ? Brushes.Blue : textBrush, rect, m_StringFormat); rect = new RectangleF(new PointF(rect.Left + rect.Width, curY), new SizeF(cellWidth * 2, cellHeight)); } //日付 int dayCount = 0; for (int row = 0; row < dayLineCount; row++) { curY = rect.Top + rect.Height; rect = new RectangleF(new PointF(x, curY), new SizeF(cellWidth * 2, cellHeight)); for (int i = 0; i < 7; i++) { string dayText = string.Empty; if(row == 0 && i < firstWeek) { dayText = string.Empty; } else { DateTime date = firstDate.AddDays((double)dayCount); if (date.Month == firstDate.Month) { dayText = date.Day.ToString(); } dayCount++; } g.DrawRectangle(Pens.Black, rect.X, rect.Y, rect.Width, rect.Height); g.DrawString(dayText, smallFont, i == (int)DayOfWeek.Sunday ? Brushes.Red : i == (int)DayOfWeek.Saturday ? Brushes.Blue : textBrush, rect, m_StringFormat); rect = new RectangleF(new PointF(rect.Left + rect.Width, curY), new SizeF(cellWidth * 2, cellHeight)); } } } private void DrawNormal(float x, float y, Graphics g, Brush textBrush) { dayRectList.Clear(); DateTime firstDate = DateTime.Parse(showValue.ToString("yyyy/MM") + "/01"); //週のタイトル int firstWeek = (int)firstDate.DayOfWeek; float curY = y; RectangleF rect = new RectangleF(new PointF(x, curY), new SizeF(cellWidth * dayWidth, cellHeight * 2)); bool isNewColor = WeekForeColor.IsSystemColor; Brush brush = isNewColor ? SystemBrushes.FromSystemColor(WeekForeColor) : new SolidBrush(WeekForeColor); using (Brush backbrush = new SolidBrush(WeekBackColor.IsEmpty ? BackColor : WeekBackColor)) { for (int i = 0; i < 7; i++) { g.FillRectangle(backbrush, rect); g.DrawRectangle(Pens.Black, rect.X, rect.Y, rect.Width, rect.Height); g.DrawString(GetWeekShortName(i), WeekFont, i == (int)DayOfWeek.Sunday ? Brushes.Red : i == (int)DayOfWeek.Saturday ? Brushes.Blue : brush, rect, m_StringFormat); rect = new RectangleF(new PointF(rect.Left + rect.Width, curY), new SizeF(cellWidth * dayWidth, cellHeight * 2)); } } if (isNewColor) { brush.Dispose(); } //日付 int dayCount = 0; for (int row = 0; row < dayLineCount; row++) { curY = rect.Top + rect.Height; rect = new RectangleF(new PointF(x, curY), new SizeF(cellWidth * dayWidth, cellHeight * dayHeight)); for (int i = 0; i < 7; i++) { DateTime date; bool isOutOfRange = false; string dayText = string.Empty; if (row == 0 && i < firstWeek) { date = firstDate.AddDays((double)(i - firstWeek)); dayText = date.Day.ToString(); isOutOfRange = true; } else { date = firstDate.AddDays((double)dayCount); if (date.Month != firstDate.Month) { isOutOfRange = true; } dayText = date.Day.ToString(); dayCount++; } dayRectList.Add(date.ToString("yyyy/MM/dd"), rect); RectangleF dayRect = new RectangleF(new PointF(rect.X, rect.Y), new SizeF(cellWidth * 3, cellHeight * 2)); //Raise DayCellFormat CalendarEventArgs args = new CalendarEventArgs() { DateValue = date, DateText = dayText, Rokuyou = RokuyouVisible ? JapaneseDateTime.ToRokuyou(date) : string.Empty, Holiday = string.Empty, MemoText = string.Empty }; if(DayCellFormat != null) { DayCellFormat(this, args); } Color hitColor = m_MouseDown && !DayDownColor.IsEmpty ? DayDownColor : !DayOverColor.IsEmpty ? DayOverColor : ControlPaint.Light(!SelDayBackColor.IsEmpty && Value.Date.CompareTo(date.Date) == 0 ? SelDayBackColor : DayBackColor.IsEmpty ? BackColor : DayBackColor); using (Brush backbrush = currHitType == HitType.Day && currHitValue.CompareTo(date.ToString("yyyy/MM/dd")) == 0 ? new SolidBrush(hitColor) : new SolidBrush(!SelDayBackColor.IsEmpty && Value.Date.CompareTo(date.Date) == 0 ? SelDayBackColor : DayBackColor.IsEmpty ? BackColor : DayBackColor)) { g.FillRectangle(backbrush, rect); } g.DrawRectangle(Pens.Black, rect.X, rect.Y, rect.Width, rect.Height); //日付 isNewColor = DayForeColor.IsSystemColor; brush = isNewColor ? SystemBrushes.FromSystemColor(DayForeColor) : new SolidBrush(DayForeColor); g.DrawString(args.DateText, DayFont, isOutOfRange ? Brushes.Gray : i == (int)DayOfWeek.Sunday ? Brushes.Red : i == (int)DayOfWeek.Saturday ? Brushes.Blue : brush, dayRect, m_StringFormat); if (isNewColor) { brush.Dispose(); } //六曜 if (RokuyouVisible) { RectangleF rokuyouRect; isNewColor = RokuyouForeColor.IsSystemColor && !isOutOfRange; brush = isOutOfRange ? Brushes.Gray : isNewColor ? SystemBrushes.FromSystemColor(RokuyouForeColor) : new SolidBrush(RokuyouForeColor); if (DayStyle == DayStyleType.Row4) { rokuyouRect = new RectangleF(new PointF(rect.X, rect.Y + cellHeight * 2), new SizeF(cellWidth * 3, cellHeight)); g.DrawString(args.Rokuyou, rokuyouFont, brush, rokuyouRect, m_StringFormat); } else { rokuyouRect = new RectangleF(new PointF(rect.X + cellWidth * 3, rect.Y), new SizeF(cellWidth * 2, cellHeight)); g.DrawString(args.Rokuyou, rokuyouFont, brush, rokuyouRect, m_StringFormatLeft); } if (isNewColor) { brush.Dispose(); } } //祝日 if (args.Holiday.Length > 0) { RectangleF holidayRect; isNewColor = HolidayForeColor.IsSystemColor && !isOutOfRange; brush = isOutOfRange ? Brushes.Gray : isNewColor ? SystemBrushes.FromSystemColor(HolidayForeColor) : new SolidBrush(HolidayForeColor); if (DayStyle == DayStyleType.Row4) { holidayRect = new RectangleF(new PointF(rect.X, rect.Y + cellHeight * 3), new SizeF(cellWidth * dayWidth, cellHeight)); g.DrawString(args.Holiday, holidayFont, brush, holidayRect, m_StringFormat); } else { holidayRect = new RectangleF(new PointF(rect.X, rect.Y + cellHeight * 2), new SizeF(cellWidth * 3, cellHeight)); g.DrawString(args.Holiday, holidayFont, brush, holidayRect, m_StringFormatLeft); } if (isNewColor) { brush.Dispose(); } } //メモ if (args.MemoText.Length > 0) { RectangleF memoRect; isNewColor = MemoForeColor.IsSystemColor && !isOutOfRange; brush = isOutOfRange ? Brushes.Gray : isNewColor ? SystemBrushes.FromSystemColor(MemoForeColor) : new SolidBrush(MemoForeColor); if (DayStyle == DayStyleType.Row4) { memoRect = new RectangleF(new PointF(rect.X + cellWidth * 3, rect.Y), new SizeF(cellWidth * 2, cellHeight * 3)); g.DrawString(args.MemoText, MemoFont, brush, memoRect, m_StringFormat); } else { memoRect = new RectangleF(new PointF(rect.X + cellWidth * 3, rect.Y + cellHeight * 1), new SizeF(cellWidth * 2, cellHeight * 2)); g.DrawString(args.MemoText, MemoFont, brush, memoRect, m_StringFormat); } if (isNewColor) { brush.Dispose(); } } rect = new RectangleF(new PointF(rect.Left + rect.Width, curY), new SizeF(cellWidth * dayWidth, cellHeight * dayHeight)); } } } protected override void OnMouseWheel(MouseEventArgs e) { //if (e.Delta > 0) //{ // if (m_TabKeyList.Count - m_TopIndex > m_TabCount) { m_TopIndex++; } //} //else //{ // if (m_TopIndex > 0) { m_TopIndex--; } //} base.OnMouseWheel(e); Invalidate(); } protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.Tab) return true; if (keyData == (Keys.Tab | Keys.Shift)) return true; switch (keyData) { case Keys.Left: return true; case Keys.Right: return true; } return base.ProcessCmdKey(ref msg, keyData); } protected override void OnMouseClick(MouseEventArgs e) { base.OnMouseClick(e); HitTestInfo item = HitTest(e.X, e.Y); if(currHitType == HitType.CurrentDay) { showValue = Value; } else if (currHitType == HitType.MonthPrev) { showValue = showValue.AddMonths(-1); } else if (currHitType == HitType.MonthNext) { showValue = showValue.AddMonths(1); } else if (currHitType == HitType.YearPrev) { showValue = showValue.AddYears(-1); } else if (currHitType == HitType.YearNext) { showValue = showValue.AddYears(1); } else if (currHitType == HitType.Day) { Value = DateTime.Parse(item.Value); showValue = Value; } Invalidate(); if (currHitType == HitType.Day && DateSelect != null) { CalendarEventArgs args = new CalendarEventArgs() { DateValue = Value, DateText = Text, Rokuyou = string.Empty, Holiday = string.Empty, MemoText = string.Empty }; DateSelect(this, args); } } protected override void OnMouseMove(MouseEventArgs e) { HitTestInfo item = HitTest(e.X, e.Y); Invalidate(); base.OnMouseMove(e); } protected override void OnMouseEnter(System.EventArgs e) { m_MouseFocused = true; Invalidate(); base.OnMouseEnter(e); } protected override void OnMouseLeave(System.EventArgs e) { m_MouseFocused = false; Invalidate(); base.OnMouseLeave(e); } protected override void OnMouseDown(MouseEventArgs e) { HitTestInfo item = HitTest(e.X, e.Y); m_MouseDown = true; this.Focus(); Invalidate(); base.OnMouseDown(e); } protected override void OnMouseUp(MouseEventArgs e) { m_MouseDown = false; Invalidate(); base.OnMouseUp(e); } protected override void OnResize(System.EventArgs e) { Invalidate(); base.OnResize(e); } #endregion #region ★★★★★ Private Function ★★★★★ #endregion #region ★★★★★ Public Function ★★★★★ private bool InRectangle(RectangleF r, int x, int y) { return (r.X <= (float)x && (float)x <= (r.X + r.Width)) && (r.Y <= (float)y && (float)y <= (r.Y + r.Height)); } public HitTestInfo HitTest(int x, int y) { HitTestInfo hit = new HitTestInfo(); hit.x = x; hit.y = y; currHitType = HitType.None; currHitValue = string.Empty; for (int i = 0; i < buttonRectList.Count; i++) { if (buttonRectList[i].Contains((float)x, (float)y)) { Cursor = Cursors.Hand; hit.type = (HitType)(i + 1); currHitType = hit.Type; return hit; } } foreach(KeyValuePair item in dayRectList) { if (item.Value.Contains((float)x, (float)y)) { Cursor = Cursors.Hand; hit.type = HitType.Day; hit.value = item.Key; currHitType = hit.Type; currHitValue = hit.value; return hit; } } Cursor = Cursors.Default; return HitTestInfo.Nowhere; } #endregion } }