先上图。
要点:
- 双缓冲
- this.SuspendLayout(); this.ResumeLayout();
- 堆控件
- 写委托事件
一.双缓冲
this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.AllPaintingInWmPaint, true);
二.SuspendLayout & ResumeLayout
临时的挂起控件属性层
恢复挂起的控件属性层
三.堆控件
InitialMycalendar(date);
1
this.SuspendLayout();2

3
this.Today = date;4
this.Today_Year = date.Year;5
this.Today_Month = date.Month;6
this.Today_Day = date.Day;7
//自定义显示格式8
lb_date.Text = Today_Year + "年" + Today_Month + "月";9
//周标题数组10
WeekScheme[0] = new Label();11
WeekScheme[1] = new Label();12
WeekScheme[2] = new Label();13
WeekScheme[3] = new Label();14
WeekScheme[4] = new Label();15
WeekScheme[5] = new Label();16
WeekScheme[6] = new Label();17

18
WeekScheme[0].Text = "Su";19
WeekScheme[1].Text = "Mo";20
WeekScheme[2].Text = "Tu";21
WeekScheme[3].Text = "We";22
WeekScheme[4].Text = "Th";23
WeekScheme[5].Text = "Fr";24
WeekScheme[6].Text = "Sa";25
//添加控件26
this.Controls.AddRange(WeekScheme);27
//获取当月天数28
ThisMonthDays = getSumDaysInThisMonth();29

30
for (int i = 0; i < 42; i++)31

{32
try33

{34
DateTime dt = DateTime.Parse(Today_Year + "-" + Today_Month + "-01").AddDays(i);35
if (i < ThisMonthDays)36

{37
//日数组38
MonthNode[i] = new DayNode(dt);39
MonthNode[i].SelectedDay += new MouseEventHandler(MyCalendar_SelectedDay);40
MonthNode[i].MoveLeave += new EventHandler(MyCalendar_MoveLeave);41
MonthNode[i].MoveOver += new EventHandler(MyCalendar_MoveOver);42

43
}44
else45

{46
MonthNode[i] = null;47
}48
if (dt.CompareTo(date) == 0)49

{50
SelectedDayNode = MonthNode[i];51

52
}53
}54
catch55

{56

57
}58
}59
if (SelectedDayNode != null)60

{61
SelectedDayNode.Controls[0].BackColor = Color.Tomato;62
}63
//添加控件64
this.Controls.AddRange(MonthNode);65
this.DrawAllTheNodes();66
this.ResumeLayout();
PS:
如何计算某月的天数?
TimeSpan myTime = DateTime.Parse(Today_Year + "-" + Today_Month + "-01").AddMonths(1).AddDays(-1) - DateTime.Parse(Today_Year + "-" + Today_Month + "-01");
return myTime.Days + 1;
四.写委托事件
//声明事件部分
public event SelectButtonHandler OnSelect;
//调用部分
if (OnSelect != null)
{
OnSelect(sender, new SelectNodeAgs(this.SelectedDayNode.DayOfMonth));
}
关键的要点都在这里了。
还可以根据实际的项目的情况扩展控件。
最基本的:可以选取时间的TextBox 控件。
上图中就是这个控件的实现图。
转载于:https://www.cnblogs.com/wuhucome888/archive/2009/03/03/1402526.html