DayView - 类似 Outlook 的约会视图






4.93/5 (25投票s)
2001年5月25日
9分钟阅读

644548

6046
一个模仿 Microsoft Outlook 2000/XP 约会列表视图行为的 ActiveX 控件
有什么新功能?
自从我发布这个控件以来,收到了很多反馈——有些比其他的要友好一些。一些 bug 已经被发现,甚至被使用该控件的人修复了。我自己已经很久没有使用这个控件了,但似乎其他人还在使用——所以这里是一个更新。
已作出以下改进
RemoveAllAppointments
bug 已修复- 更新了 Visual Basic 对象浏览器中显示的方法和属性的描述
- 资源不再标记为丹麦语,而是标记为中性资源。
- 对输入参数更加宽容。现在您可以指定一个完整的日期,控件会自动将其转换为一天中的时间。
- 使用
E_INVALIDARG
而不是更通用的E_FAIL
- 已添加带有新方法和属性的 ICalendar2 接口
感谢以下人士
- Cchenzhu - 注意到滚动 bug,即点击滚动条箭头无任何反应。
- Mirano Galijasevic - 为我提供了修复 RemoveAllApointments() bug 的代码
新功能在 ICalendar2 接口中实现,以避免破坏任何现有代码。从 Visual Basic 访问 ActiveX 控件的 ICalendar2
接口需要一个小技巧。
Dim c2 As ICalendar2 ' The second interface to be accessed Set c2 = Calendar1.Object 'Access the ActiveX object's 'Object' property c2.SetWorkDay startTime, endTime ' Use a function in the interface
请注意,ICalendar2
接口不能从无类型脚本语言访问,因为它们只支持访问 COM 对象的默认接口。
引言
在创建用户界面时,尽量使其看起来像微软的界面通常是个好主意。这样做的好处是,您的用户能够立即使用程序,并且他们会熟悉完成某项任务所需的步骤。这就是这个控件背后的理念,它模仿了 Microsoft Outlook 2000 和 XP 中实现的约会视图。
实现细节
该控件是一个非 Unicode 的 ATL ActiveX 控件,静态链接到 MFC 库。没错:我为一个 COM 对象使用了 MFC。我知道这会使代码臃肿,但我习惯于 MFC 处理 GDI 的方式,而这个控件大量使用了 GDI。
如果您不想使用 ActiveX 控件,将其移植到 C DLL 或仅仅包含源文件应该是相当简单的。
免责声明和致谢
本控件及源代码可免费用于商业和非商业软件。但是,您不应以盈利为目的出售源代码。对于本软件或使用本软件的应用程序直接或间接造成的任何损害,我概不负责。如果它炸毁了您的电脑、伤害了您的宠物或让您的妻子怀孕,那不是我的问题。
如果您决定重新分发源代码,请在源代码的某个地方包含我的姓名和电子邮件。如果您使用此控件创建了一个应用程序,我将不胜感激您能给我发一封邮件描述它是什么。
感谢 David Hill - dhill@PrincipiaMathematica.com 提供了此组件中使用的优秀 CPinnableDlg
。
已知问题
这个控件并不完美。我选择发布它是因为 Code Project 休息室里有人在寻找这样的控件。以下是一些我希望在未来版本中解决的问题。如果我决定处理这些问题,我当然会发布更新。
- 重绘。如果控件被另一个窗口覆盖,当该窗口在控件的绘图表面前移动时,会画出一些细线。它们在控件下次重绘时会消失,但仍然相当烦人。
- 重叠的约会。如果多个约会安排在同一个时间段,它们都会被画在“彼此之上”。我还没能想出一个聪明的算法,让这些约会像在 Outlook 中那样显示,即在每个重叠的约会之间平均分配可用空间。这个控件只是让它们堆叠显示。
如果您解决了这些问题中的任何一个,请在 CodeProject 上发布或告知我,我将把它们放入未来的更新中。
文档
本文档中没有记录源代码。如果您了解 ATL 和 MFC,阅读它应该没有问题。代码没有被注释所掩盖,所以应该很容易阅读 ;-)
DayView.dll 由四个对象组成:Calendar
、ICalendar2
、IAppointment
和 DayViewDlg
。下面分别记录了每个对象的属性和方法。
ICalendar2 接口
ICalendar2
接口添加了以下方法和属性
SetWorkDay 方法
描述
设置“工作日”的时间间隔。“工作日”由亮黄色表示。
语法
Object.SetWorkDay(Start As Date, End As Date)
SetWorkDay 方法事件接受这些参数
零件 描述 Start
工作日应开始的时间。不要指定日期——只指定一天中的时间。此参数是必需的。 End
工作日应结束的时间。不要指定日期——只指定一天中的时间。'To' 的值应晚于 'From'。此参数是必需的。
备注
将两个参数都指定为 0 以不显示工作日间隔。
MilitaryTime 属性
属性
读/写布尔值。
描述
决定控件左侧的时间标尺是显示为军事时间(0-24小时)还是 AM/PM(0-12小时)。
默认为 true
语法
Object.MilitaryTime = false ' 以美国格式显示时间
备注
无备注。
Calendar 对象
Calendar 对象是一个可视化的 ActiveX 控件。它绘制界面并显示约会。
AddAppointment 方法
描述
向视图中添加一个具有开始和结束时间、主题和详细描述(正文)的新的有时间限制的约会。
语法
Object.AddAppointment(From As Date, To As Date, Subject As String, Body As String)
AddAppointment
方法事件接受这些参数
零件 描述 从
约会应开始的时间。不要指定日期——只指定一天中的时间。此参数是必需的。 改为
约会应结束的时间。不要指定日期——只指定一天中的时间。'To' 的值应晚于 'From'。此参数是必需的。 主题
描述约会的简短说明性文本。此参数是必需的。 正文
关于约会的详细信息。可能包含多行。此参数可以为空。
备注
如果您要创建一个全天约会,则不希望指定开始和结束时间。请改用 AddFullDayAppointment 方法。
AddFullDayAppointment 方法
描述
向视图中添加一个约会。该约会不显示在控件的显示区域中,而是显示在上方,作为一个内部带有文本的“块”。
语法
Object.AddFullDayAppointment(From As Date, To As Date)
AddFullDayAppointment
方法事件接受这些参数
零件 描述 主题
描述约会的简短说明性文本。此参数是必需的。 正文
关于约会的详细信息。可能包含多行。此参数可以为空。
备注
如果您要在一天内创建一个有时间限制的约会,并且不想指定开始和结束时间,请改用 AddAppointment 方法。
GotoTime 方法
描述
如果指定的时间不可见,则将其滚动到视图中。
语法
Object.GotoTime(DATE Time)
GotoTime
事件接受此参数
零件 描述 时间
应滚动到视图中的一天中的时间。不要指定日期——只指定一天中的时间。此参数是必需的。
备注
指定的时间将被滚动到视图中,使其显示在控件客户区的顶部。
RemoveAllAppointments 方法
描述
从视图中清除所有约会。全天和有时间限制的约会都会被移除。
语法
Object.RemoveAllAppointments(DATE Time)
RemoveAllAppointments 方法不接受任何参数
备注
none
HourHeight 属性
属性
读/写长整型值。
描述
设置每小时的高度(以像素为单位)。
语法
Object.HourHeight = 24 ' 使每小时高度为 24 像素
备注
控件的总可滚动区域将是 24 小时,每小时的高度为
HourHeight
像素。
OnClick 事件
描述
当控件中的约会被点击时,此事件被触发。
语法
object_OnClick(Appointment As IAppointment)
OnClick
事件提供此参数
零件 描述 约会 对 appointment 对象 的引用。
备注
无论是点击全天约会还是有时间限制的约会,都会触发此事件。
OnContextMenu 事件
描述
当控件中的约会被点击时,此事件被触发。
语法
object_OnContextMenu(Appointment As IAppointment)
OnContextMenu
事件提供此参数
零件 描述 约会
对 appointment 对象 的引用。
备注
无论是右键单击全天约会还是有时间限制的约会,都会触发此事件。
OnDoubleClick 事件
描述
当控件中的约会被点击时,此事件被触发。
语法
object_OnDoubleClick(Appointment As IAppointment)
OnDoubleClick
事件提供此参数
零件 描述 约会 对 appointment 对象 的引用。
备注
无论是双击全天约会还是有时间限制的约会,都会触发此事件。
IAppointment 接口
IAppointment
接口不是一个可创建的对象。它是一个用于描述约会的只读对象。
属性
此表描述了 IAppointment 对象的只读属性。
属性 类型 描述 从
日期 约会的开始时间。如果约会是全天约会,则此属性的值是未定义的。 改为
日期 约会的结束时间。如果约会是全天约会,则此属性的值是未定义的。 FullDayAppointment
布尔值 如果这是一个全天约会,则为 True。 主题
字符串 描述约会的简短文本。 正文
字符串 约会的详细描述。此属性可以为空。
Calendar 属性
属性
对 Calendar 对象的只读引用。
描述
获取对对话框中托管的 Calendar 对象的引用。
语法
Dim cal as Calendar
Set cal = Object.Calendar
备注
对 calendar 对象的引用仅在
DayViewDlg
对象有效期间有效。获得引用后,可以像这里描述的那样操作Calendar
对象。
ShowMonthSelector 属性
属性
读/写布尔值。
描述
确定月份选择器控件在对话框的客户区是否可见。
语法
Object.ShowMonthSelector = true
备注
none
OnDateChanged 事件
描述
当用户使用 MonthSelector 控件更改日期时,此事件被触发。
语法
object_OnDateChanged(NewDate As Date, Calendar As Calendar)
OnDateChanged
事件提供这些参数
零件 描述 NewDate
从月份选择器对象中选择的日期。此日期不包含时间,因为时间完全不相关。 日历
对 DayViewDlg
对象中使用的 calendar 的引用。
备注
可以缓存对 calendar 对象的引用。只需记住,此引用仅在
DayViewDlg
对象有效期间有效。