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
}
}