一.运行时效果
二.简单的谈谈实现思路
当前的这个控件,是完全绘制出来的,主要包含2个部分,一个就是我在前边提到的"周控制台",这个控制台本身也是一个控件,在里面主要包含了一个属性SelectedDate,这个日期,将会作为传入下面实际显示日程安排的控件.第二就是这个显示具体日程安排的控件了,这个控件按照传入的具体一天的时间(可以定制),根据工作开始时间与结束时间等等信息,使用不同颜色来显示了当天的所有日程安排.用户可以随意去更改,添加日程信息.当用户双击某一个时间段的白色区域时,会显示一个输入框,用户可以在输入框中完成添加或更改,删除等操作,离开光标后,修改自动提交.这里的数据处理,采用了读取与写入XML文件的方式,速度还不错.同时,因为当前系统设置的时候,只考虑了一个周期7天的日程定义,所以也就安排了7个XML文件,所以,这样就会限制用户只能对7天以内的信息做处理.例如,今天是3月4号,那么到了3月11号,同样是星期二,使用的将是同一个XML文件.
三.部分源代码
因为一些原因,源代码不能完全公布,感兴趣的朋友可以发mail给我,
该控件的完整源代码也将出售,感兴趣的朋友,欢迎发邮件咨询,谢谢!当然,对于讨论创建思路,讨论解决方法的朋友,也欢迎你发邮件,多多交流!
protected
override
void
OnMouseMove(MouseEventArgs e)
... {
base.OnMouseMove(e);
_lastrect = this._mousemoverefreshrect;
this.MouseMoveWeek = this.GetMouseMoveWeek(new Point(e.X, e.Y));
//if (_mousemoveweek != -1)
//{
// //this.Invalidate(_mousemoverefreshrect);
//}
}
protected override void OnMouseDown(MouseEventArgs e)
... {
base.OnMouseDown(e);
if (e.Button == MouseButtons.Left)
...{
this._mousedownweek = GetMouseMoveWeek(new Point(e.X, e.Y));
if (_mousedownweek == 0)
...{
this.CurrentDate = _currentdate.AddDays(-7);
}
else if (_mousedownweek == _dayCount + 2 - 1)
...{
this.CurrentDate = _currentdate.AddDays(7);
}
else
...{
int currentdateweek = GetWeekInteger(_currentdate );
this.SelectedDate = this._currentdate.AddDays(_mousedownweek - currentdateweek);
this.Invalidate();
}
}
}
private int GetMouseMoveWeek(Point p)
... {
int returnvalue = -1;
int weekwidth = (this.Width - 6 - 2*_adjustSpace - (_dayCount + 2 -1)*_weekSpace) / (_dayCount );
if (weekwidth < 20)
return 0;
int left = 0;
int top = 2;
for (int i = 0; i < _dayCount + 2; i++)
...{
Rectangle rect = new Rectangle(left, top, _adjustSpace, _weekHeight);
//调整宽度
if (i != 0 && i != _dayCount + 2 - 1)
...{
rect.Width = weekwidth;
}
if(rect.Contains(p))
...{
returnvalue = i;
_mousemoverefreshrect = rect;
break;
}
if (i == 0)
...{
left += _adjustSpace + _weekSpace;
}
else if (i == _dayCount + 2 - 1)
...{
}
else
...{
left += weekwidth + _weekSpace;
}
}
return returnvalue;
}
private string GetWeekStr( int intweek)
... {
string weekstr = "星期";
switch (intweek )
...{
case 1:
weekstr += "一";
break;
case 2:
weekstr += "二";
break;
case 3:
weekstr += "三";
break;
case 4:
weekstr += "四";
break;
case 5:
weekstr += "五";
break;
case 6:
weekstr += "六";
break;
case 7:
weekstr += "日";
break;
}
return weekstr;
}
/**/ /// <summary>
/// 获取当前月份的1号是星期几
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
private int GetWeekInteger(DateTime date)
... {
int returnvalue = 0;
switch (date.DayOfWeek)
...{
case DayOfWeek.Sunday:
returnvalue = 7;
break;
case DayOfWeek.Monday:
returnvalue = 1;
break;
case DayOfWeek.Tuesday:
returnvalue = 2;
break;
case DayOfWeek.Wednesday:
returnvalue = 3;
break;
case DayOfWeek.Thursday:
returnvalue = 4;
break;
case DayOfWeek.Friday:
returnvalue = 5;
break;
case DayOfWeek.Saturday:
returnvalue = 6;
break;
}
return returnvalue;
}
... {
base.OnMouseMove(e);
_lastrect = this._mousemoverefreshrect;
this.MouseMoveWeek = this.GetMouseMoveWeek(new Point(e.X, e.Y));
//if (_mousemoveweek != -1)
//{
// //this.Invalidate(_mousemoverefreshrect);
//}
}
protected override void OnMouseDown(MouseEventArgs e)
... {
base.OnMouseDown(e);
if (e.Button == MouseButtons.Left)
...{
this._mousedownweek = GetMouseMoveWeek(new Point(e.X, e.Y));
if (_mousedownweek == 0)
...{
this.CurrentDate = _currentdate.AddDays(-7);
}
else if (_mousedownweek == _dayCount + 2 - 1)
...{
this.CurrentDate = _currentdate.AddDays(7);
}
else
...{
int currentdateweek = GetWeekInteger(_currentdate );
this.SelectedDate = this._currentdate.AddDays(_mousedownweek - currentdateweek);
this.Invalidate();
}
}
}
private int GetMouseMoveWeek(Point p)
... {
int returnvalue = -1;
int weekwidth = (this.Width - 6 - 2*_adjustSpace - (_dayCount + 2 -1)*_weekSpace) / (_dayCount );
if (weekwidth < 20)
return 0;
int left = 0;
int top = 2;
for (int i = 0; i < _dayCount + 2; i++)
...{
Rectangle rect = new Rectangle(left, top, _adjustSpace, _weekHeight);
//调整宽度
if (i != 0 && i != _dayCount + 2 - 1)
...{
rect.Width = weekwidth;
}
if(rect.Contains(p))
...{
returnvalue = i;
_mousemoverefreshrect = rect;
break;
}
if (i == 0)
...{
left += _adjustSpace + _weekSpace;
}
else if (i == _dayCount + 2 - 1)
...{
}
else
...{
left += weekwidth + _weekSpace;
}
}
return returnvalue;
}
private string GetWeekStr( int intweek)
... {
string weekstr = "星期";
switch (intweek )
...{
case 1:
weekstr += "一";
break;
case 2:
weekstr += "二";
break;
case 3:
weekstr += "三";
break;
case 4:
weekstr += "四";
break;
case 5:
weekstr += "五";
break;
case 6:
weekstr += "六";
break;
case 7:
weekstr += "日";
break;
}
return weekstr;
}
/**/ /// <summary>
/// 获取当前月份的1号是星期几
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
private int GetWeekInteger(DateTime date)
... {
int returnvalue = 0;
switch (date.DayOfWeek)
...{
case DayOfWeek.Sunday:
returnvalue = 7;
break;
case DayOfWeek.Monday:
returnvalue = 1;
break;
case DayOfWeek.Tuesday:
returnvalue = 2;
break;
case DayOfWeek.Wednesday:
returnvalue = 3;
break;
case DayOfWeek.Thursday:
returnvalue = 4;
break;
case DayOfWeek.Friday:
returnvalue = 5;
break;
case DayOfWeek.Saturday:
returnvalue = 6;
break;
}
return returnvalue;
}