Date日期选择美化控件----------WinForm控件开发系列
效果图:
控件的功能包括以下。
年 年月 年月日 年月日时 年月日时分 年月日时分秒
日期面板控件 DatePickerExt 是基于 Control 控件基础类开发的,不是由组合控件组成的,也就是说 DatePickerExt 没有用到WinForm其他的一些基础控件,界面上的按钮也是直接用 GDI 绘制出来的。而 DateExt 控件基于 Control 控件基础类 配合 TextBox 控件 开发的,弹出层则是用 ToolStripDropDown 组件完成。这个以后应该不会更新,应该比较完善,日期和时间功能都有了,格式化后也有8000多行代码。
DateExt 控件介绍:
通过对 DateStyle 属性设置,控件功能可以是输入模式或只能从日期面板选择模式。 输入模式是启用 TextBox 控件, 只能从日期面板选择 则直接由GDI绘制界面。
通过 ReadOnly 属性可以设置 DateExt 控件只读,也就是输入模式或只能从日期面板选择模式的功能都被禁止。
通过 Tab 键可以激活控件,在通过 Enter 键打开弹层。如下:
当控件为输入模式时,在控件激活状态下可以通过键盘的左右键分别选中年、月、日 的值再通过键盘的上下键修改值,这是模拟原生控件的功能,如下:
重写方法如下
新增属性如下
DatePickerExt 控件介绍:
这个控件的UI界面是参考网上JQ日期插件开发出来的。
日期面板主界面主要由三部分组成,界面布局的信息存放在 DateClass 类里面,里面包括
DateTopBarClass(日期面板顶部工具栏)、 DateMainClass(日期面板)、 BottomBarClass(底部工具栏)
这些类主要记录按钮、选项的 Rectangle 信息,控件的鼠标事件和单击事件都是通过重写基类相应事件和配合Rectangle从而判断事件的处理方式。
DateDisplayType 属性可以设置面板的功能,包括(年、年月、年月日、年月日时、、年月日时分、、年月日时分秒)六种功能。
通过设置 AutoConfirm 属性可以自动完成面板的确认按钮事件,但限制与以下情况
1.在年功能选择年份时。
2.在年月功能选择月份时。
3.在年月日功能选择日时,
4.点击底部工具栏的清除按钮时。
5.点击底部工具栏现在按钮时。
通过设置 DateReadOnly 属性可以把面板设置成只读的状态。
日期值和这三个属性有关 DateValue(日期值)、MinDateValue(限制 DateValue 的最小值)、MaxDateValue(限制 DateValue 的最大值)。
MinMaxInput 属性为 True 是限制 MinDateValue 和 MaxDateValue 只会在日期面板上手动选择时才做出限制,例如 MinDateValue 为2005年,MaxDateValue 为2009,代码直接赋值 DateValue 为2000年 ,这种情况下 DateValue 不会受 MinDateValue 、MaxDateValue 的限制,但又不能通过日期面板选择超出范围的年份。否则任何情况下 DateValue 都会受 MinDateValue 、MaxDateValue 的限制。
通过 MinMaxTip 属性可以设置是否显示 MinDateValue 和 MaxDateValue 的提示如下红色边框内容:
顶部工具栏功能包括年份、月前后移动和打开年面板月面板。
下图是时间按钮,
按钮会根据控件的时间制动绘制出相应的时间刻度。如下
时间选项列表的滚动条是用 GUI 绘制结合鼠标事件模仿的。滚动条还能通过滚轮操作。
重写方法如下
公开方法如下
新增类如下
新增事件如下
新增属性如下
控件的每次的绘制会使用到大量的画笔,因此我把控件所需要用到的画笔都放在 SolidBrushManage 里面去管理,画笔会在日期面板隐藏或日期棉般失去激活状态时自动释放画笔,我之前试过直接在每次绘制控件时都初始化画笔,用.NET Memory Profiler 4.0 可以观察画笔的创建和释放会变得很频繁。所以目前我采取这种做法,你也可以继续优化这一部分。目前控件的绘制时整个界面全部一起绘制的,你也可以优化成局部更新绘制。