65.9K
CodeProject 正在变化。 阅读更多。
Home

ToDoList 8.2 - 一种有效且灵活的任务管理方式

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (2395投票s)

2003年11月4日

Eclipse

12分钟阅读

viewsIcon

73812977

downloadIcon

441799

一个分层任务管理器,具有原生 XML 支持,用于自定义报告

下载次数


第三方

注意:请直接联系各自的作者咨询评论和问题

todolist2/CP_screenshot2.png

最新更新 (8.2 功能发布)

  • 添加了“Markdown”注释
  • 添加了“循环依赖”的突出显示
  • 为“自定义属性”添加了“计算”功能
  • 为“周计划”添加了“自定义日期”属性
  • 为“日历”添加了“自定义日期”属性
  • 从“资源管理器”拖放文件到“电子表格”注释
  • 添加了创建“ToDoList UDT”的专用工具栏按钮
  • 在“过滤栏”中添加了“重复”选项
  • 添加了“-mp”命令行开关,将第一个解密密码用作“主密码”
  • 在“查找任务”对话框中添加了工具栏按钮,以便在停靠时关闭
  • 在“日历”偏好设置中添加了在单元格标题中显示“周数”的选项
  • 在“思维导图”中添加了“直线连接”选项
  • 在“属性继承”中添加了“完成日期”
  • 改进了重叠“日历”任务的布局
  • 改进了“到期任务通知”超链接的处理
  • 改进了“时间跟踪器”任务选择
  • 改进了“编辑依赖关系”任务选择
  • 提高了“平面”任务列表的性能

引言

你知道的,你开始做一个项目,做到一半,你发现需要解决一两个副项目才能继续进行原来的项目。

这个项目就是其中之一,而且还有一个额外的转折,它本身最初也是一个副项目。事情是这样的

<播放屏幕波动效果>

我只能想象当时行星(失)对齐之类的,因为几个月前,我突然收到了四五个关于我之前提交给 CodeProject 的文章的电子邮件,有些要求添加功能,有些要求修复 bug。

无论明智与否,我基本上同意了提出的所有观点,结果发现自己有十四五个独立的问题需要解决。

情况还因为我试图使用 CodeProject 来跟踪我同意做的所有事情而变得更糟,这意味着我必须不断地翻阅每篇文章的评论区,提醒自己我应该做什么。

甚至到了我担心会无法完成某项工作的地步——我知道这很傻,但事实就是如此!

列一个纸质清单绝对是正确的方向,但由于我所有的编码都在同一台机器上完成,这显得有些不够优雅,而且,我们都知道放在桌子上的重要纸张会发生什么。

下一步是上网搜索一个工具来满足以下要求:

  • 界面简洁
  • 支持分层数据
  • 项目/子项目编号
  • 开放文件格式
  • 免费

很简单,对吧?

我承认我并没有花几周时间搜索,但我仍然对普遍缺乏符合我需求的软件感到惊讶。

回想起来,我认为原因很简单:人们习惯了商业软件的“功能丰富”,所以在自己设计软件时,他们(并非不合理地)认为也需要尽可能多地塞入功能,这通常导致软件中大量基本功能隐藏在菜单栏中。

所以,毫不意外,我决定自己写点什么。

然而,公平地说,我最初并不打算将它发布到 CodeProject,我这样做主要是因为我非常享受解决一些非常有趣的问题,而我认为这些问题让它值得一试。

使用软件

这里真的没有什么需要多说的,因为每一个功能/特性都在界面中清晰可见。

尽管如此,以下基本功能和遗漏的列表可能有助于回答可能出现的任何问题:

  • 文件以 XML 格式存储,扩展名为*.xml*。
  • 尝试加载非任务列表文件通常会失败(除非你阅读代码了解如何规避)。
  • 项目/子项目的数量仅受内存限制(尽管在耗尽内存之前性能可能是决定因素)。
  • 将父项目标记为“完成”也会使子项目变灰,但它们不会被禁用或自动标记为“完成”。
  • 省略号 (...) 表示项目有子项目。
  • 所有项目都可以展开或折叠(通过双击)。
  • 顶级项目和子项目使用不同的工具栏按钮创建。
  • 有特定于任务的上下文菜单。
  • 上次打开的任务列表将在启动时重新打开。
  • 在关闭软件或将其最小化到系统托盘时,任务列表会自动保存。
  • 任务的优先级显示为项目左侧的灰度框。

关注点

这里我们谈到了我之前提到的副项目,其中前两个我打算写成后续文章。

它们是:

  1. “有序”树控件,包含用于显示项目编号的非客户端边距.

    这个想法源于我对树列表控件替代设计的调研,它并没有通过创建包含树和列表的混合控件来解决问题。

    混合控件似乎是一个显而易见的解决方案,以至于我认为很少有人质疑它,但它仍然让我觉得看起来太费力而不够优雅(“方枘”和“圆凿”浮现在脑海中)。

    一种可能的想法是在树的非客户端区域完全实现“列表”部分。也就是说,将客户端边缘向左移动,然后在产生的非客户端区域渲染列表部分。

    虽然我还没有时间构建概念验证,但正是这种持续的思维辩论促使我尝试通过在非客户端区域渲染项目/子项目编号来解决编号项目和子项目的问题。

    这里不过多详细介绍(因为这本身将是一篇独立的文章),但这就是我如何实现它的:

    • 处理 TVM_INSERTITEMTVM_DELETEITEM 以准确知道项目何时添加和删除。
    • 在这些处理程序中,重新计算显示最宽的“点状”项目/子项目编号所需的边距宽度。(注意:这不一定仅仅是最深的子项目。)
    • 如果所需的边距宽度发生变化,则调用 SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER) 来强制 Windows 重新计算控件的非客户端区域。
    • 处理 WM_NCCALCSIZE,并在此时将左边框偏移所需的边距宽度。
    • 处理 WM_NCPAINT 用于绘制编号。

    这必然是一个过度简化,但它抓住了解决方案的精髓,所有剩下的就是大量的调整,以确保非客户端区域在正确的时间重绘,以与客户端区域保持同步。

  2. 将 .RC 控件定义数据直接嵌入 .cpp 文件中,以打破对二进制资源的依赖(又名“运行时对话框”).

    这个想法已经流传了一段时间,最近才形成了一个可行的解决方案。

    简单来说,问题是,如果你想利用 Visual Studio 中的资源编辑器(谁不想呢?),那么你很快就会发现自己不得不加载编译到二进制文件中的资源中的对话框模板。

    这进一步意味着,如果你想在多个项目中使用同一个对话框,那么你必须在项目*.RC*文件中复制粘贴对话框模板,或者你需要将对话框构建到 DLL 中,然后从中访问。

    “运行时对话框”(一个我自创的响亮名字)是一个巧妙的解决方案,可以避免在资源文件之间复制对话框资源的麻烦,以及将对话框打包到 DLL 中所需的额外工作(和维护)。

    它是这样工作的:

    • 首先,你在资源编辑器中设计你的对话框模板,使用类向导创建一个 CDialog 派生类,并像平常一样连接所有控件。
    • 接下来,你 #include "runtimedlg.h",并将所有 CDialog 的实例更改为 CRuntimeDlg
    • 然后,你将控件定义部分从*.RC*文件中的相应部分复制粘贴,并将其作为静态字符串直接嵌入对话框的*.cpp*文件中(需要进行一些调整来处理双引号等)。
    • 最后,在你的对话框的构造函数中,你只需调用 CRuntimeDlg::AddRCControls(...),并将控件定义作为字符串传递。
    • CRuntimeDlg 将负责其余部分,包括根据需要自动调整对话框以适应控件布局。

    我当然不是说这是一个“双赢”的解决方案,但它肯定有其优点,因为它将对话框模板与对话框代码更紧密地结合在一起,使得跨多个项目共享对话框变得轻而易举。

    附注:以防万一不清楚,我使用了 CRuntimeDlg 来创建 CToDoCtrl,它将有序树与优先级、日期和注释控件封装成一个易于实例化的简单控件。

    我还计划在我的 VC6 的 ProjectZip 插件的 .NET 端口中使用它们。

  3. 网页中嵌入 XML 文件.

    这可能是整个项目中令人最满意的一方面,因为它完全是出乎意料的。

    我的意思是,直到最近,我对 DOM 和 XMLDOM 的了解几乎为零,因为只有当我越来越对 AbstractSpoon 的呈现方式感兴趣时,我才被迫去掌握各种 DOM 和 XMLDOM 的实现。

    我很高兴地说,我网站上的代码在 IE 6.0、Netscape 7.1 和 Mozilla 下都能运行,尽管需要自定义代码才能实现这一点。

可能对你有用的通用 MFC 类

下表列出了为本项目编写的各种实用类。只要包含任何类依赖项,它们都可以包含在任何 MFC 项目中。欢迎随时就这些特定类以及如何使用它们提出问题。

类名

描述

类依赖项
(除 MFC 外)

CAboutDlg

可自定义的“关于...”对话框,无需对话框资源。支持 HTML 编码文本

CRuntimeDlg, CRCCtrlParser

CAutoComboBox

只添加唯一项到下拉列表,并重新排序列表,使最后添加的项位于顶部

CHoldRedraw

CAutoFlag

封装了在类的实例生命周期中设置和取消设置布尔变量

 

CColorButton

非所有者绘制按钮,显示所选颜色在按钮面上,点击时显示颜色对话框

CEnColorDialog

CColorComboBox

所有者绘制组合框,用于显示和选择用户定义的颜色

 

CDateHelper

封装了用于计算日期跨度和格式化的各种例程

 

CDeferWndMove

封装了 Win32 API

 

CDialogHelper

重新实现了 CDialog 的 DDX/DDV 例程,以避免用户清除数字编辑框(例如)时的 MFC 错误消息

 

CDlgUnits

封装了 MapDialogRect Win32 API

 

CDockManager

用于管理一个弹出窗口停靠到另一个窗口的类。

*CSubclassWnd, CHoldRedraw, CAutoFlag

CDriveInfo

封装了用于查询驱动器、文件和磁盘空间的各种例程

 

CEnBitmap

CBitmap 添加了加载非 BMP 文件和资源的支持。

 

CEnBitmapEx, CColorReplacer, CImageBlurrer, CImageColorizer, CImageContraster, CImageEmbosser, CImageFlipper, CImageGrayer, CImageLightener, CImageNegator, CImageResizer, CImageRotator, CImageSharpener, CImageShearer, CImageSysColorMapper, CImageTinter

CEnBitmap 添加了图像处理功能

CEnBitmap

CEnColorDialog

CColorDialog 添加了自定义颜色的保存和恢复功能

 

CEnCommandLineInfo

添加了用于提取和查询命令行开关的函数

 

CEnEdit

CEdit 添加了用户定义的按钮功能

CMaskEdit, CThemed, CDlgUnits

CEnToolBar

添加了使用替代资源或文件图像的支持

 

CFileEdit

添加了用于浏览和显示编辑控件中文本所代表的文件的按钮。还显示文件的图标。

CEnEdit, CFolderDialog, CMaskEdit, CDlgUnits, CThemed, CSysImageList

CHoldRedraw

封装了 WM_SETREDRAW

 

CHotKeyCtrlEx

修复了许多行为问题,包括对某些按键的处理

 

CHotTracker

跟踪鼠标在用户定义窗口上的移动,并根据需要发送事件消息

*CSubclassWnd,

CLimitSingleInstance

提供了一种简单的方法来检测应用程序是否已运行另一个实例

 

CMaskEdit

CEdit 添加了简单的字符掩码

 

CNcGutter

通过支持任意数量的列添加到窗口的非客户端区域,允许扩展标准窗口控件的 UI。偏向于列表、树等表格控件

*CSubclassWnd, CHoldRedraw, CThemed, CDlgUnits

COrderedTreeCtrl

CNcGutterCTreeCtrl 实现,显示一个单独的列,用“1.2.3.4”的格式表示每个树项目的层级位置。

CHoldRedraw, CThemed

CPasswordDialog

非常简单的密码对话框,无需对话框资源

CRuntimeDlg, CRCCtrlParser

CPropertyPageHost

CPropertySheet 的简化替代品,允许更轻松地创建为子窗口

 

CRCCtrlParser

CRuntimeDlg 用于解析对话框资源类文本

 

CRuntimeDlg

CDialog 添加了在运行时构建对话框的支持,即对话框不需要对话框资源

CRCCtrlParser

CShortcutManager

用于处理应用程序键盘快捷键的类。

*CSubclassWnd, CWinClasses

CSpellCheckDlg

拼写检查对话框,无需对话框资源,它与 ISpellCheck (与 Open Office 字典的接口)交互

CRuntimeDlg, CRCCtrlParser, ISpellCheck

CSysImageList

封装了 Windows 系统图像列表(文件/文件夹图像)

 

CTabCtrlEx

在不使用所有者绘制的情况下,为选项卡添加了渲染后回调

 

CThemed

封装了窗口控件的有主题(XP)和无主题(其余)绘制

 

CTimeEdit

添加了用于指定时间单位的按钮,并提供了将时间转换为不同时间单位的例程

CEnEdit, CMaskEdit, CThemed, CDlgUnits

CToolbarHelper

添加了对对话框工具栏工具提示、多行工具提示和带菜单的下拉按钮的支持

*CSubclassWnd, CEnBitmap, CEnBitmapEx

CTrayIcon

封装了 Shell_NotifyIcon Win32 API。还提供气球提示和动画

*CSubclassWnd,

CUrlRichEditCtrl

添加了对识别 URL、点击它们和设置自定义 URL 回调的支持

 

CWinClasses

封装了 ::GetClassName Win32 函数

 

CXmlFile, CXmlItem

用于读写 XML 文件的非 Unicode 类

 

CXmlFileEx

CXmlFile 添加了加密功能

CXmlFile, IEncryption

* CSubclassWnd 最初由 Paul DiLascia 为 MSJ 杂志编写。我使用的版本已大大扩展以适应我的特定需求。此处依赖它的类需要此扩展版本。

进一步工作

虽然这个工具最初仅供我个人使用,但现在它是一个“社区”项目,因此如果您发现它有用并希望提出增强或错误修复的建议,请发布到我们的 Google Group

历史

  • 历史记录现 在此
  • 1.1-7.1 已由 .dan.g. 移除
  • 1.0 (2003 年 11 月 4 日)
© . All rights reserved.