📄 calendar.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using System.Drawing;
using System.Drawing.Design;
using System.Drawing.Drawing2D;
using System.ComponentModel;
using System.Threading;
namespace MonthCalendar
{
[DesignerAttribute(typeof(CalendarDesigner))]
[DefaultProperty("Name")]
public class Calendar: Control
{
private CultureInfo m_Culture;
private DateTimeFormatInfo m_DateTimeFormatInfo;
private DatesCollection m_Dates = null;
private SelectedItemsCollection m_SelectedDates = null;
private Day m_FirstDayOfWeek = Day.Default;
private HeaderElementStyle m_HeaderStyle = null;
private WeekDayElementStyle m_WeekDaysStyle = null;
private WeekNumbersElementStyle m_WeekNumbers = null;
private MonthDaysElementStyle m_MonthDaysStyle = null;
private FooterElementStyle m_Footer = null;
private MonthImageData m_MonthImages = null;
private KeyboardControl m_KeyboardControl = null;
private WeekDayItem[,] m_WeekDayItems = new WeekDayItem[7, 6];
private BorderStyle m_Border;
private DateTime m_SelectedDate = DateTime.Now;
private DateTime m_MinDate = new DateTime(1753, 1, 1);
private DateTime m_MaxDate = new DateTime(9998, 12, 31);
private Graphics m_Graphics;
private ViewMode m_ViewMode = ViewMode.vmMonth;
private SelectionMode m_SelectionMode = SelectionMode.smOne;
private SelectedDay m_MouseSelectedDay;
private SelectedDay m_MouseSelectedDayBackup;
private SelectedDay m_StartMultiSelectionHover;
private Button m_PreviousButton = null;
private Button m_NextButton = null;
private Button m_PreviousYearButton = null;
private Button m_NextYearButton = null;
private ImageList m_Images = null;
private GlobalHook m_GloabalKeyBoardHook = new GlobalHook();
private bool m_WeekDayArrayAlreadyCreated = false;
private bool m_MouseInTitleText = false;
private bool m_MouseInWeekDay = false;
private bool m_bMouseHover = false;
private bool m_bKeyHandled = false;
private bool m_bMOuseHoverHeader = false;
private bool m_bOnlyMonthMode = false;
private bool m_bMultipleSelectingModeActive = false;
private bool m_bCanSelectTrailingDates = true;
private bool m_bInitialised = false;
private int m_Start12YearsRange = 2001;
private int m_End12YearsRange = 2012;
private int m_Start120YearsRange = 1990;
private int m_End120YearsRange = 2100;
private int m_NextTopPos = 0;
private int m_TitlebarHeight = 0;
private int m_WeekDayWidth = 0;
private int m_WeekDayHeight = 0;
private int m_MonthWidth = 0;
private int m_MonthHeight = 0;
private int m_SundayIndex = 0;
private int m_FirstWeekNumber = 0;
private int m_TitleTextLeftStartPos = 0;
private int m_TitleTextWidth = 0;
private int m_TitleTextTopStartPos = 0;
private int m_TitleTextHeight = 0;
private int m_WeekDaysTopStartPos = 0;
private int m_WeekDaysLeftStartPos = 0;
private int m_SelectedMonthIndex = 0;
private int m_MonthDayWidthOffset = 0;
private int m_MonthDayHeightOffset = 0;
private int m_DrawedMonthDayTopStartPos = 0;
private int m_DrawedMonthDayHeight = 0;
public Calendar() {
//initialize control
this.ResizeRedraw = true;
this.SetStyle(System.Windows.Forms.ControlStyles.DoubleBuffer, true);
this.SetStyle(System.Windows.Forms.ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.Selectable, true);
this.UpdateStyles();
m_Culture = CultureInfo.CurrentCulture;
m_DateTimeFormatInfo = DateTimeFormatInfo.CurrentInfo;
m_Dates = new DatesCollection(this);
m_SelectedDates = new SelectedItemsCollection(this);
//titlebar style element
m_HeaderStyle = new HeaderElementStyle(this);
m_HeaderStyle.Font = new Font(this.Font.Name, this.Font.Size);
m_HeaderStyle.ForeColor = Color.FromArgb(255, 155, 155, 155);
m_HeaderStyle.Border.Visible = false;
m_HeaderStyle.Border.BorderColor = Color.Black;
m_HeaderStyle.Border.Transparency = 255;
m_HeaderStyle.Background.StartColor = Color.White;
m_HeaderStyle.Background.EndColor = Color.Black;
m_HeaderStyle.Background.Style = EStyle.esParent;
m_HeaderStyle.Background.Gradient = GradientStyle.Vertical;
m_HeaderStyle.Background.TransparencyStartColor = 255;
m_HeaderStyle.Background.TransparencyEndColor = 255;
//header style element
m_WeekDaysStyle = new WeekDayElementStyle(this);
m_WeekDaysStyle.Font = new Font(this.Font.Name, this.Font.Size);
m_WeekDaysStyle.ForeColor = Color.FromArgb(255, 155, 155, 155);
m_WeekDaysStyle.Border.Visible = true;
m_WeekDaysStyle.Border.BorderColor = Color.Black;
m_WeekDaysStyle.Border.Transparency = 255;
m_WeekDaysStyle.Background.StartColor = Color.White;
m_WeekDaysStyle.Background.EndColor = Color.Black;
m_WeekDaysStyle.Background.TransparencyStartColor = 255;
m_WeekDaysStyle.Background.TransparencyEndColor = 255;
m_WeekDaysStyle.Background.Style = EStyle.esParent;
m_WeekDaysStyle.Background.Gradient = GradientStyle.Vertical;
//weeknumbers style element
m_WeekNumbers = new WeekNumbersElementStyle(this);
m_WeekNumbers.Font = new Font(this.Font.Name, this.Font.Size);
m_WeekNumbers.ForeColor = Color.FromArgb(255, 155, 155, 155);
m_WeekNumbers.Border.Visible = true;
m_WeekNumbers.Border.BorderColor = Color.Black;
m_WeekNumbers.Border.Transparency = 255;
m_WeekNumbers.Background.StartColor = Color.White;
m_WeekNumbers.Background.EndColor = Color.Black;
m_WeekNumbers.Background.TransparencyStartColor = 255;
m_WeekNumbers.Background.TransparencyEndColor = 255;
m_WeekNumbers.Background.Style = EStyle.esParent;
m_WeekNumbers.Background.Gradient = GradientStyle.Vertical;
//weekday style
m_MonthDaysStyle = new MonthDaysElementStyle(this);
m_MonthDaysStyle.Font = new Font(this.Font.Name, this.Font.Size);
m_MonthDaysStyle.ForeColor = Color.Black;
m_MonthDaysStyle.Border.Visible = false;
m_MonthDaysStyle.Border.BorderColor = Color.Black;
m_MonthDaysStyle.Border.Transparency = 255;
m_MonthDaysStyle.Background.StartColor = Color.White;
m_MonthDaysStyle.Background.EndColor = Color.Black;
m_MonthDaysStyle.Background.TransparencyStartColor = 255;
m_MonthDaysStyle.Background.TransparencyEndColor = 255;
m_MonthDaysStyle.Background.Style = EStyle.esParent;
m_MonthDaysStyle.Background.Gradient = GradientStyle.Vertical;
//
m_Footer = new FooterElementStyle(this);
//
m_Border = new BorderStyle(this);
m_Border.Visible = false;
m_Border.BorderColor = Color.Black;
m_Border.Transparency = 255;
//
m_KeyboardControl = new KeyboardControl(this);
//
m_MonthImages = new MonthImageData(this);
m_PreviousButton = new Button();
m_PreviousButton.Image = Properties.Resources.previous;
m_PreviousButton.Visible = false;
m_PreviousButton.Click += new EventHandler(PrevClick);
m_NextButton = new Button();
m_NextButton.Image = Properties.Resources.next;
m_NextButton.Visible = false;
m_NextButton.Click += new EventHandler(NextClick);
m_PreviousYearButton = new Button();
m_PreviousYearButton.Image = Properties.Resources.PrevYear;
m_PreviousYearButton.Visible = false;
m_PreviousYearButton.Click += new EventHandler(PrevYearClick);
m_NextYearButton = new Button();
m_NextYearButton.Image = Properties.Resources.nextYear;
m_NextYearButton.Visible = false;
m_NextYearButton.Click += new EventHandler(NextYearClick);
this.SetBounds(0, 0, 200, 175);
this.Controls.Add(m_PreviousButton);
this.Controls.Add(m_NextButton);
this.Controls.Add(m_PreviousYearButton);
this.Controls.Add(m_NextYearButton);
//install keyboard hook
m_GloabalKeyBoardHook.InstallKeyBoardHook();
m_GloabalKeyBoardHook.OnKeyDown += new KeyEventHandler(Hook_KeyDown);
m_GloabalKeyBoardHook.OnKeyUp += new KeyEventHandler(Hook_KeyUp);
}
protected override void Dispose(bool disposing)
{
//remove global keyboard hook
m_GloabalKeyBoardHook.RemoveHook();
base.Dispose(disposing);
}
#region properties
[Browsable(false)]
public SelectedItemsCollection Selected
{
get
{
return m_SelectedDates;
}
}
[Description("set calendars startzoom"), Category("Behavior")]
public ViewMode StartWithZoom
{
get
{
return m_ViewMode;
}
set
{
m_ViewMode = value;
Invalidate();
}
}
[Description("set true to select days from other month"), Category("Behavior")]
public bool CanSelectTrailingDates
{
get
{
return m_bCanSelectTrailingDates;
}
set
{
m_bCanSelectTrailingDates = value;
if (CanSelectTrailingDatesChanged != null) CanSelectTrailingDatesChanged(this, EventArgs.Empty);
}
}
[Description("set mode to select days"), Category("Behavior")]
public SelectionMode SelectionMode
{
get
{
return m_SelectionMode;
}
set
{
if (value == SelectionMode.smMulti)
AddSelectedItem(m_SelectedDate);
m_SelectionMode = value;
if (SelectionModeChanged != null) SelectionModeChanged(this, EventArgs.Empty);
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Description("Set footer style"), Category("Appearance")]
public FooterElementStyle Footer
{
get
{
return m_Footer;
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Description("set calendars borderstyle"), Category("Appearance")]
public BorderStyle Border
{
get
{
return m_Border;
}
}
[Category("Behavior")]
[Description("if true user cannot zoomout calendar to a other range")]
public bool OnlyMonthMode
{
get
{
return m_bOnlyMonthMode;
}
set
{
m_bOnlyMonthMode = value;
//set viewmode to month mode
if (value == true)
{
if (m_ViewMode != ViewMode.vmMonth)
{
SetViewMode(ViewMode.vmMonth, m_ViewMode);
}
}
if (OnlyMonthModeChanged != null) OnlyMonthModeChanged(this, EventArgs.Empty);
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Category("Behavior"), Description("setup calendar keyboard steering")]
public KeyboardControl Keyboard
{
get
{
return m_KeyboardControl;
}
}
[Description("set imagelist used with formated days"), Category("Behavior")]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -