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
|
{
|
/// <summary>
|
/// コピーだけ、全く書いてない
|
/// テスト
|
/// </summary>
|
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<RectangleF> buttonRectList = new List<RectangleF>();
|
private SortedList<string, RectangleF> dayRectList = new SortedList<string, RectangleF>();
|
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(); }
|
}
|
}
|
|
/// <summary>
|
/// 前月、来月の小さいカレンダーを描く
|
/// </summary>
|
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<string, RectangleF> 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
|
}
|
}
|