+ UICalendar: 增加日历控件

This commit is contained in:
Sunny 2022-06-28 17:41:56 +08:00
parent 2d8daa6d2b
commit dcb69df130
7 changed files with 998 additions and 4 deletions

View File

@ -355,9 +355,12 @@ namespace Sunny.UI
private void TopPanel_Click(object sender, EventArgs e)
{
TabControl.SelectedTab = tabPage1;
if (TabControl.SelectedIndex > 0)
{
TabControl.SelectedIndex--;
activeDay = -1;
}
}
private DateTime date;

View File

@ -779,9 +779,12 @@ namespace Sunny.UI
private void TopPanel_Click(object sender, EventArgs e)
{
TabControl.SelectedTab = tabPage1;
if (TabControl.SelectedIndex > 0)
{
TabControl.SelectedIndex--;
activeDay = -1;
}
}
private void SetYears(int iy)
{

View File

@ -0,0 +1,847 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2022 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UICalendar.cs
* :
* : V3.2
* : 2022-06-28
*
* 2022-06-28: V3.2.0
******************************************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
namespace Sunny.UI
{
public class UICalendar : UIUserControl
{
public UICalendar()
{
InitializeComponent();
ShowType = UIDateType.YearMonthDay;
Date = DateTime.Now.Date;
Width = 300;
Height = 240;
TabControl.TabVisible = false;
MinimumSize = new Size(240, 180);
Translate();
}
#region InitializeComponent
private UITabControl TabControl;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private UIPanel p1;
private UISymbolButton b4;
private UISymbolButton b3;
private UISymbolButton b2;
private UISymbolButton b1;
private UIPanel p2;
private System.Windows.Forms.TabPage tabPage3;
private UIPanel p3;
private UIPanel TopPanel;
private void InitializeComponent()
{
this.TopPanel = new Sunny.UI.UIPanel();
this.b4 = new Sunny.UI.UISymbolButton();
this.b3 = new Sunny.UI.UISymbolButton();
this.b2 = new Sunny.UI.UISymbolButton();
this.b1 = new Sunny.UI.UISymbolButton();
this.TabControl = new Sunny.UI.UITabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.p1 = new Sunny.UI.UIPanel();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.p2 = new Sunny.UI.UIPanel();
this.tabPage3 = new System.Windows.Forms.TabPage();
this.p3 = new Sunny.UI.UIPanel();
this.TopPanel.SuspendLayout();
this.TabControl.SuspendLayout();
this.tabPage1.SuspendLayout();
this.tabPage2.SuspendLayout();
this.tabPage3.SuspendLayout();
this.SuspendLayout();
//
// TopPanel
//
this.TopPanel.Controls.Add(this.b4);
this.TopPanel.Controls.Add(this.b3);
this.TopPanel.Controls.Add(this.b2);
this.TopPanel.Controls.Add(this.b1);
this.TopPanel.Dock = System.Windows.Forms.DockStyle.Top;
this.TopPanel.Font = new System.Drawing.Font("微软雅黑", 12F);
this.TopPanel.Location = new System.Drawing.Point(0, 0);
this.TopPanel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.TopPanel.MinimumSize = new System.Drawing.Size(1, 1);
this.TopPanel.Name = "TopPanel";
this.TopPanel.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.TopPanel.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top)
| System.Windows.Forms.ToolStripStatusLabelBorderSides.Right)));
this.TopPanel.Size = new System.Drawing.Size(461, 31);
this.TopPanel.StyleCustomMode = true;
this.TopPanel.TabIndex = 0;
this.TopPanel.Text = "2020-05-05";
this.TopPanel.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
this.TopPanel.ZoomScaleRect = new System.Drawing.Rectangle(0, 0, 0, 0);
this.TopPanel.Click += new System.EventHandler(this.TopPanel_Click);
//
// b4
//
this.b4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.b4.BackColor = System.Drawing.Color.Transparent;
this.b4.Cursor = System.Windows.Forms.Cursors.Hand;
this.b4.FillColor = System.Drawing.Color.White;
this.b4.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.b4.Font = new System.Drawing.Font("微软雅黑", 12F);
this.b4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.b4.ImageInterval = 0;
this.b4.Location = new System.Drawing.Point(427, 4);
this.b4.MinimumSize = new System.Drawing.Size(1, 1);
this.b4.Name = "b4";
this.b4.Padding = new System.Windows.Forms.Padding(24, 0, 0, 0);
this.b4.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.b4.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.b4.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.None;
this.b4.Size = new System.Drawing.Size(30, 24);
this.b4.Style = Sunny.UI.UIStyle.Custom;
this.b4.StyleCustomMode = true;
this.b4.Symbol = 61697;
this.b4.TabIndex = 3;
this.b4.TipsFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.b4.ZoomScaleRect = new System.Drawing.Rectangle(0, 0, 0, 0);
this.b4.Click += new System.EventHandler(this.b4_Click);
//
// b3
//
this.b3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.b3.BackColor = System.Drawing.Color.Transparent;
this.b3.Cursor = System.Windows.Forms.Cursors.Hand;
this.b3.FillColor = System.Drawing.Color.White;
this.b3.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.b3.Font = new System.Drawing.Font("微软雅黑", 12F);
this.b3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.b3.ImageInterval = 0;
this.b3.Location = new System.Drawing.Point(391, 4);
this.b3.MinimumSize = new System.Drawing.Size(1, 1);
this.b3.Name = "b3";
this.b3.Padding = new System.Windows.Forms.Padding(24, 0, 0, 0);
this.b3.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.b3.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.b3.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.None;
this.b3.Size = new System.Drawing.Size(30, 24);
this.b3.Style = Sunny.UI.UIStyle.Custom;
this.b3.StyleCustomMode = true;
this.b3.Symbol = 61701;
this.b3.TabIndex = 2;
this.b3.TipsFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.b3.ZoomScaleRect = new System.Drawing.Rectangle(0, 0, 0, 0);
this.b3.Click += new System.EventHandler(this.b3_Click);
//
// b2
//
this.b2.BackColor = System.Drawing.Color.Transparent;
this.b2.Cursor = System.Windows.Forms.Cursors.Hand;
this.b2.FillColor = System.Drawing.Color.White;
this.b2.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.b2.Font = new System.Drawing.Font("微软雅黑", 12F);
this.b2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.b2.ImageInterval = 0;
this.b2.Location = new System.Drawing.Point(40, 4);
this.b2.MinimumSize = new System.Drawing.Size(1, 1);
this.b2.Name = "b2";
this.b2.Padding = new System.Windows.Forms.Padding(24, 0, 0, 0);
this.b2.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.b2.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.b2.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.None;
this.b2.Size = new System.Drawing.Size(30, 24);
this.b2.Style = Sunny.UI.UIStyle.Custom;
this.b2.StyleCustomMode = true;
this.b2.Symbol = 61700;
this.b2.TabIndex = 1;
this.b2.TipsFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.b2.ZoomScaleRect = new System.Drawing.Rectangle(0, 0, 0, 0);
this.b2.Click += new System.EventHandler(this.b2_Click);
//
// b1
//
this.b1.BackColor = System.Drawing.Color.Transparent;
this.b1.Cursor = System.Windows.Forms.Cursors.Hand;
this.b1.FillColor = System.Drawing.Color.White;
this.b1.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.b1.Font = new System.Drawing.Font("微软雅黑", 12F);
this.b1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.b1.ImageInterval = 0;
this.b1.Location = new System.Drawing.Point(4, 4);
this.b1.MinimumSize = new System.Drawing.Size(1, 1);
this.b1.Name = "b1";
this.b1.Padding = new System.Windows.Forms.Padding(24, 0, 0, 0);
this.b1.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.b1.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.b1.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.None;
this.b1.Size = new System.Drawing.Size(30, 24);
this.b1.Style = Sunny.UI.UIStyle.Custom;
this.b1.StyleCustomMode = true;
this.b1.Symbol = 61696;
this.b1.TabIndex = 0;
this.b1.TipsFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.b1.ZoomScaleRect = new System.Drawing.Rectangle(0, 0, 0, 0);
this.b1.Click += new System.EventHandler(this.b1_Click);
//
// TabControl
//
this.TabControl.Controls.Add(this.tabPage1);
this.TabControl.Controls.Add(this.tabPage2);
this.TabControl.Controls.Add(this.tabPage3);
this.TabControl.Dock = System.Windows.Forms.DockStyle.Fill;
this.TabControl.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
this.TabControl.Font = new System.Drawing.Font("微软雅黑", 12F);
this.TabControl.ItemSize = new System.Drawing.Size(150, 40);
this.TabControl.Location = new System.Drawing.Point(0, 31);
this.TabControl.MainPage = "";
this.TabControl.Name = "TabControl";
this.TabControl.SelectedIndex = 0;
this.TabControl.Size = new System.Drawing.Size(461, 317);
this.TabControl.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
this.TabControl.Style = Sunny.UI.UIStyle.Custom;
this.TabControl.TabIndex = 1;
this.TabControl.TipsFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.TabControl.ZoomScaleRect = new System.Drawing.Rectangle(0, 0, 0, 0);
this.TabControl.SelectedIndexChanged += new System.EventHandler(this.TabControl_SelectedIndexChanged);
//
// tabPage1
//
this.tabPage1.Controls.Add(this.p1);
this.tabPage1.Location = new System.Drawing.Point(0, 40);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Size = new System.Drawing.Size(461, 277);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "tabPage1";
this.tabPage1.UseVisualStyleBackColor = true;
//
// p1
//
this.p1.Dock = System.Windows.Forms.DockStyle.Fill;
this.p1.FillColor = System.Drawing.Color.White;
this.p1.Font = new System.Drawing.Font("微软雅黑", 12F);
this.p1.Location = new System.Drawing.Point(0, 0);
this.p1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.p1.MinimumSize = new System.Drawing.Size(1, 1);
this.p1.Name = "p1";
this.p1.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.p1.Size = new System.Drawing.Size(461, 277);
this.p1.Style = Sunny.UI.UIStyle.Custom;
this.p1.TabIndex = 0;
this.p1.Text = null;
this.p1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
this.p1.ZoomScaleRect = new System.Drawing.Rectangle(0, 0, 0, 0);
this.p1.Paint += new System.Windows.Forms.PaintEventHandler(this.p1_Paint);
this.p1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.p1_MouseClick);
this.p1.MouseLeave += new System.EventHandler(this.p1_MouseLeave);
this.p1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.p1_MouseMove);
//
// tabPage2
//
this.tabPage2.Controls.Add(this.p2);
this.tabPage2.Location = new System.Drawing.Point(0, 40);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Size = new System.Drawing.Size(200, 60);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "tabPage2";
this.tabPage2.UseVisualStyleBackColor = true;
//
// p2
//
this.p2.Dock = System.Windows.Forms.DockStyle.Fill;
this.p2.FillColor = System.Drawing.Color.White;
this.p2.Font = new System.Drawing.Font("微软雅黑", 12F);
this.p2.Location = new System.Drawing.Point(0, 0);
this.p2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.p2.MinimumSize = new System.Drawing.Size(1, 1);
this.p2.Name = "p2";
this.p2.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.p2.Size = new System.Drawing.Size(200, 60);
this.p2.Style = Sunny.UI.UIStyle.Custom;
this.p2.TabIndex = 1;
this.p2.Text = null;
this.p2.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
this.p2.ZoomScaleRect = new System.Drawing.Rectangle(0, 0, 0, 0);
this.p2.Paint += new System.Windows.Forms.PaintEventHandler(this.p2_Paint);
this.p2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.p2_MouseClick);
this.p2.MouseLeave += new System.EventHandler(this.p2_MouseLeave);
this.p2.MouseMove += new System.Windows.Forms.MouseEventHandler(this.p2_MouseMove);
//
// tabPage3
//
this.tabPage3.Controls.Add(this.p3);
this.tabPage3.Location = new System.Drawing.Point(0, 40);
this.tabPage3.Name = "tabPage3";
this.tabPage3.Size = new System.Drawing.Size(200, 60);
this.tabPage3.TabIndex = 2;
this.tabPage3.Text = "tabPage3";
this.tabPage3.UseVisualStyleBackColor = true;
//
// p3
//
this.p3.Dock = System.Windows.Forms.DockStyle.Fill;
this.p3.FillColor = System.Drawing.Color.White;
this.p3.Font = new System.Drawing.Font("微软雅黑", 12F);
this.p3.Location = new System.Drawing.Point(0, 0);
this.p3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.p3.MinimumSize = new System.Drawing.Size(1, 1);
this.p3.Name = "p3";
this.p3.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.p3.Size = new System.Drawing.Size(200, 60);
this.p3.Style = Sunny.UI.UIStyle.Custom;
this.p3.TabIndex = 2;
this.p3.Text = null;
this.p3.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
this.p3.ZoomScaleRect = new System.Drawing.Rectangle(0, 0, 0, 0);
this.p3.Paint += new System.Windows.Forms.PaintEventHandler(this.p3_Paint);
this.p3.MouseClick += new System.Windows.Forms.MouseEventHandler(this.p3_MouseClick);
this.p3.MouseLeave += new System.EventHandler(this.p3_MouseLeave);
this.p3.MouseMove += new System.Windows.Forms.MouseEventHandler(this.p3_MouseMove);
//
// UIDate
//
this.Controls.Add(this.TabControl);
this.Controls.Add(this.TopPanel);
this.FillColor = System.Drawing.Color.White;
this.Name = "UIDate";
this.Size = new System.Drawing.Size(461, 348);
this.Style = Sunny.UI.UIStyle.Custom;
this.TopPanel.ResumeLayout(false);
this.TabControl.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.tabPage2.ResumeLayout(false);
this.tabPage3.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion InitializeComponent
private readonly List<string> months = new List<string>();
private readonly List<int> years = new List<int>();
private readonly List<DateTime> days = new List<DateTime>();
public override void SetDPIScale()
{
if (!IsScaled)
{
TopPanel.SetDPIScaleFont();
}
base.SetDPIScale();
}
public void Translate()
{
months.Clear();
months.Add(UILocalize.January);
months.Add(UILocalize.February);
months.Add(UILocalize.March);
months.Add(UILocalize.April);
months.Add(UILocalize.May);
months.Add(UILocalize.June);
months.Add(UILocalize.July);
months.Add(UILocalize.August);
months.Add(UILocalize.September);
months.Add(UILocalize.October);
months.Add(UILocalize.November);
months.Add(UILocalize.December);
}
private void TopPanel_Click(object sender, EventArgs e)
{
if (TabControl.SelectedIndex > 0)
{
TabControl.SelectedIndex--;
activeDay = -1;
}
}
private DateTime date;
public DateTime Date
{
get => date;
set
{
date = value;
//TabControl.SelectPage(2);
Year = date.Year;
Month = date.Month;
SetYearMonth(Year, Month);
activeDay = -1;
switch (ShowType)
{
case UIDateType.YearMonthDay:
TabControl.SelectedTab = tabPage3;
break;
case UIDateType.YearMonth:
TabControl.SelectedTab = tabPage2;
break;
case UIDateType.Year:
TabControl.SelectedTab = tabPage1;
break;
}
TabControl_SelectedIndexChanged(TabControl, EventArgs.Empty);
}
}
public event OnDateTimeChanged OnDateTimeChanged;
[DefaultValue(UIDateType.YearMonthDay)]
[Description("日期显示类型"), Category("SunnyUI")]
public UIDateType ShowType { get; set; }
private int year;
private int Year
{
get => year;
set
{
year = value;
int iy = year / 10 * 10;
SetYears(iy);
}
}
private int Month { get; set; }
private void SetYearMonth(int iYear, int iMonth)
{
days.Clear();
DateTime dt = new DateTime(iYear, iMonth, 1);
int week = (int)dt.DayOfWeek;
bool maxToEnd = false;
DateTime dtBegin = week == 0 ? dt.AddDays(-7) : dt.AddDays(-week);
for (int i = 1; i <= 42; i++)
{
try
{
if (!maxToEnd && dtBegin.AddDays(i - 1).Date.Equals(DateTime.MaxValue.Date))
{
maxToEnd = true;
}
if (!maxToEnd)
{
DateTime lblDate = dtBegin.AddDays(i - 1);
days.Add(lblDate);
}
else
{
days.Add(DateTime.MaxValue.Date);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
p3.Invalidate();
TopPanel.Text = Year + " - " + Month.ToString("D2");
}
private void TabControl_SelectedIndexChanged(object sender, EventArgs e)
{
b2.Visible = b3.Visible = TabControl.SelectedIndex == 2;
switch (TabControl.SelectedIndex)
{
case 0:
int iy = year / 10 * 10;
SetYears(iy);
break;
case 1:
TopPanel.Text = Year.ToString();
break;
case 2:
TopPanel.Text = Year + " - " + Month.ToString("D2");
break;
}
}
private void SetYears(int iy)
{
TopPanel.Text = iy + " - " + (iy + 9);
years.Clear();
years.Add(iy - 1);
for (int i = 1; i <= 10; i++)
{
years.Add(iy + i - 1);
}
years.Add(iy + 10);
activeYear = -1;
p1.Invalidate();
}
private void b1_Click(object sender, EventArgs e)
{
switch (TabControl.SelectedIndex)
{
case 0:
Year = year / 10 * 10;
Year -= 10;
SetYears(Year);
break;
case 1:
Year -= 1;
TopPanel.Text = Year.ToString();
break;
case 2:
Year -= 1;
SetYearMonth(Year, Month);
break;
}
}
private void b2_Click(object sender, EventArgs e)
{
DateTime dt = new DateTime(Year, Month, 1);
dt = dt.AddMonths(-1);
Year = dt.Year;
Month = dt.Month;
SetYearMonth(Year, Month);
}
private void b3_Click(object sender, EventArgs e)
{
DateTime dt = new DateTime(Year, Month, 1);
if (dt.Year == DateTime.MaxValue.Year && dt.Month == DateTime.MaxValue.Month) return;
dt = dt.AddMonths(1);
Year = dt.Year;
Month = dt.Month;
SetYearMonth(Year, Month);
}
private void b4_Click(object sender, EventArgs e)
{
switch (TabControl.SelectedIndex)
{
case 0:
Year = year / 10 * 10;
if (year == 9990) return;
Year += 10;
SetYears(Year);
break;
case 1:
if (Year == DateTime.MaxValue.Year) return;
Year += 1;
TopPanel.Text = Year.ToString();
break;
case 2:
if (Year == DateTime.MaxValue.Year) return;
Year += 1;
SetYearMonth(Year, Month);
break;
}
}
/// <summary>
/// 设置主题样式
/// </summary>
/// <param name="uiColor">主题样式</param>
public override void SetStyleColor(UIBaseStyle uiColor)
{
base.SetStyleColor(uiColor);
b1.SetStyleColor(uiColor);
b2.SetStyleColor(uiColor);
b3.SetStyleColor(uiColor);
b4.SetStyleColor(uiColor);
fillColor = Color.White;
foreColor = uiColor.DropDownPanelForeColor;
b1.FillColor = b2.FillColor = b3.FillColor = b4.FillColor = TopPanel.FillColor;
RectColor = uiColor.RectColor;
b1.SymbolColor = b2.SymbolColor = b3.SymbolColor = b4.SymbolColor = uiColor.ButtonFillColor;
PrimaryColor = b1.ForeColor = b2.ForeColor = b3.ForeColor = b4.ForeColor = uiColor.ButtonFillColor;
TopPanel.RectColor = p1.RectColor = p2.RectColor = p3.RectColor = uiColor.PanelRectColor;
TopPanel.SetStyleColor(uiColor);
}
private void p2_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
for (int i = 0; i < 12; i++)
{
int width = p2.Width / 4;
int height = p2.Height / 3;
int left = width * (i % 4);
int top = height * (i / 4);
SizeF sf = e.Graphics.MeasureString(months[i], Font);
if (i + 1 == Month)
{
e.Graphics.DrawString(months[i], Font, PrimaryColor, left + (width - sf.Width) / 2, top + (height - sf.Height) / 2);
}
else
{
e.Graphics.DrawString(months[i], Font, i == activeMonth ? PrimaryColor : ForeColor, left + (width - sf.Width) / 2, top + (height - sf.Height) / 2);
}
}
}
private void p2_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
int width = p2.Width / 4;
int height = p2.Height / 3;
int x = e.Location.X / width;
int y = e.Location.Y / height;
Month = x + y * 4 + 1;
if (Month <= 0 || Month > 12) return;
SetYearMonth(Year, Month);
activeMonth = -1;
if (ShowType == UIDateType.YearMonth)
{
date = new DateTime(Year, Month, 1);
OnDateTimeChanged?.Invoke(this, new UIDateTimeArgs(date));
}
else
{
TabControl.SelectedTab = tabPage3;
}
}
private int activeMonth = -1;
private void p2_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
int width = p2.Width / 4;
int height = p2.Height / 3;
int x = e.Location.X / width;
int y = e.Location.Y / height;
int im = x + y * 4;
if (activeMonth != im)
{
activeMonth = im;
p2.Invalidate();
}
}
private int activeYear = -1;
//public bool ShowToday { get; set; }
private void p1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
for (int i = 0; i < 12; i++)
{
int width = p1.Width / 4;
int height = p1.Height / 3;
int left = width * (i % 4);
int top = height * (i / 4);
SizeF sf = e.Graphics.MeasureString(years[i].ToString(), Font);
Color color = (i == 0 || i == 11) ? Color.DarkGray : ForeColor;
if (years[i] != 10000)
{
e.Graphics.DrawString(years[i].ToString(), Font, (i == activeYear || years[i] == Year) ? PrimaryColor : color, left + (width - sf.Width) / 2, top + (height - sf.Height) / 2);
}
}
}
private void p1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
int width = p1.Width / 4;
int height = p1.Height / 3;
int x = e.Location.X / width;
int y = e.Location.Y / height;
int iy = x + y * 4;
if (activeYear != iy)
{
activeYear = iy;
p1.Invalidate();
}
}
private void p1_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
int width = p1.Width / 4;
int height = p1.Height / 3;
int x = e.Location.X / width;
int y = e.Location.Y / height;
int iy = x + y * 4;
if (iy < 0 || iy >= 12) return;
Year = years[iy] > 9999 ? 9999 : years[iy];
activeYear = -1;
if (ShowType == UIDateType.Year)
{
date = new DateTime(Year, 1, 1);
OnDateTimeChanged?.Invoke(this, new UIDateTimeArgs(date));
}
else
{
TabControl.SelectedTab = tabPage2;
p2.Invalidate();
}
}
private void p3_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
int width = p3.Width / 7;
int height = (p3.Height - 30) / 6;
SizeF sf = e.Graphics.MeasureString(UILocalize.Sunday, Font);
e.Graphics.DrawString(UILocalize.Sunday, Font, ForeColor, width * 0 + (width - sf.Width) / 2, 4 + (19 - sf.Height) / 2);
sf = e.Graphics.MeasureString(UILocalize.Monday, Font);
e.Graphics.DrawString(UILocalize.Monday, Font, ForeColor, width * 1 + (width - sf.Width) / 2, 4 + (19 - sf.Height) / 2);
sf = e.Graphics.MeasureString(UILocalize.Tuesday, Font);
e.Graphics.DrawString(UILocalize.Tuesday, Font, ForeColor, width * 2 + (width - sf.Width) / 2, 4 + (19 - sf.Height) / 2);
sf = e.Graphics.MeasureString(UILocalize.Wednesday, Font);
e.Graphics.DrawString(UILocalize.Wednesday, Font, ForeColor, width * 3 + (width - sf.Width) / 2, 4 + (19 - sf.Height) / 2);
sf = e.Graphics.MeasureString(UILocalize.Thursday, Font);
e.Graphics.DrawString(UILocalize.Thursday, Font, ForeColor, width * 4 + (width - sf.Width) / 2, 4 + (19 - sf.Height) / 2);
sf = e.Graphics.MeasureString(UILocalize.Friday, Font);
e.Graphics.DrawString(UILocalize.Friday, Font, ForeColor, width * 5 + (width - sf.Width) / 2, 4 + (19 - sf.Height) / 2);
sf = e.Graphics.MeasureString(UILocalize.Saturday, Font);
e.Graphics.DrawString(UILocalize.Saturday, Font, ForeColor, width * 6 + (width - sf.Width) / 2, 4 + (19 - sf.Height) / 2);
e.Graphics.DrawLine(Color.DarkGray, 6, 26, Width - 12, 26);
bool maxDrawer = false;
for (int i = 0; i < 42; i++)
{
int left = width * (i % 7);
int top = height * (i / 7);
sf = e.Graphics.MeasureString(days[i].Day.ToString(), Font);
Color color = (days[i].Month == Month) ? ForeColor : Color.DarkGray;
bool isDate = days[i].DateString() == date.DateString();
color = isDate ? PrimaryColor : color;
if (!maxDrawer)
{
e.Graphics.DrawString(days[i].Day.ToString(), Font, i == activeDay ? PrimaryColor : color, left + (width - sf.Width) / 2, top + 30 + (height - sf.Height) / 2);
}
if (!maxDrawer && days[i].Date.Equals(DateTime.MaxValue.Date))
{
maxDrawer = true;
}
if (isDate)
{
sf = e.Graphics.MeasureString("00", Font);
e.Graphics.DrawRectangle(PrimaryColor, new RectangleF(left + (width - sf.Width) / 2 - 2, top + 30 + (height - sf.Height) / 2 - 1, sf.Width + 3, sf.Height));
}
}
//if (ShowToday)
//{
// using (Font SubFont = new Font("微软雅黑", 10.5f / UIDPIScale.DPIScale()))
// {
// e.Graphics.FillRectangle(p3.FillColor, p3.Width - width * 4 + 1, p3.Height - height + 1, width * 4 - 2, height - 2);
// e.Graphics.FillRoundRectangle(PrimaryColor, new Rectangle(p3.Width - width * 4 + 6, p3.Height - height + 3, 8, height - 10), 3);
//
// sf = e.Graphics.MeasureString(UILocalize.Today + ": " + DateTime.Now.DateString(), SubFont);
// e.Graphics.DrawString(UILocalize.Today + ": " + DateTime.Now.DateString(), SubFont, isToday ? PrimaryColor : Color.DarkGray, p3.Width - width * 4 + 17, p3.Height - height - 1 + (height - sf.Height) / 2.0f);
//
// //sf = e.Graphics.MeasureString(DateTime.Now.DateString(), Font);
// //e.Graphics.DrawString(DateTime.Now.DateString(), Font, isToday ? PrimaryColor : Color.DarkGray, p3.Width - width * 4 + 55, p3.Height - height - 1 + (height - sf.Height) / 2.0f);
// }
//}
}
private int activeDay = -1;
//private bool isToday;
private void p3_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Location.Y <= 30)
{
activeDay = -1;
p3.Invalidate();
return;
}
int width = p3.Width / 7;
int height = (p3.Height - 30) / 6;
int x = e.Location.X / width;
int y = (e.Location.Y - 30) / height;
int iy = x + y * 7;
//bool istoday = ShowToday && e.Location.Y > p3.Top + p3.Height - height && e.Location.X > p3.Left + width * 3;
if (activeDay != iy)// || istoday != isToday)
{
//isToday = istoday;
activeDay = iy;
p3.Invalidate();
}
}
private void p3_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Location.Y <= 30) return;
int width = p3.Width / 7;
int height = (p3.Height - 30) / 6;
int x = e.Location.X / width;
int y = (e.Location.Y - 30) / height;
int id = x + y * 7;
if (id < 0 || id >= 42) return;
date = days[id].Date;
p3.Invalidate();
//if (ShowToday && e.Location.Y > p3.Height - height && e.Location.X > p3.Width - width * 4)
//{
// date = DateTime.Now.Date;
//}
OnDateTimeChanged?.Invoke(this, new UIDateTimeArgs(date));
}
[Browsable(false)]
public Color PrimaryColor { get; set; } = UIColor.Blue;
private void p1_MouseLeave(object sender, EventArgs e)
{
activeYear = -1;
p1.Invalidate();
}
private void p2_MouseLeave(object sender, EventArgs e)
{
activeMonth = -1;
p2.Invalidate();
}
private void p3_MouseLeave(object sender, EventArgs e)
{
activeDay = -1;
p3.Invalidate();
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -49,6 +49,7 @@ namespace Sunny.UI
base.MinimumSize = new Size(1, 1);
}
[Browsable(false)]
public bool Disabled => !Enabled;
/// <summary>

View File

@ -19,6 +19,8 @@
* 2020-01-01: V2.2.0
******************************************************************************/
using System;
namespace Sunny.UI
{
/// <summary>
@ -34,4 +36,21 @@ namespace Sunny.UI
public const int EditorMinHeight = 20;
public const int EditorMaxHeight = 60;
}
public class UIDateTimeArgs : EventArgs
{
public DateTime DateTime { get; set; }
public UIDateTimeArgs()
{
}
public UIDateTimeArgs(DateTime datetime)
{
DateTime = datetime;
}
}
public delegate void OnDateTimeChanged(object sender, UIDateTimeArgs e);
}

View File

@ -50,6 +50,7 @@ namespace Sunny.UI
SetStyleFlags(true, false);
}
[Browsable(false)]
public bool Disabled => !Enabled;
/// <summary>