[译]ToDoList 8.0-一种有效且灵活的方式来处理任务
By robot-v1.0
本文链接 https://www.kyfws.com/applications/todolist-8-0-an-effective-and-flexible-way-to-keep-zh/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 19 分钟阅读 - 9019 个词 阅读量 0[译]ToDoList 8.0-一种有效且灵活的方式来处理任务
原文地址:https://www.codeproject.com/Articles/5371/ToDoList-8-0-An-Effective-and-Flexible-Way-to-Keep
原文作者:.dan.g.
译文由本站 robot-v1.0 翻译
前言
A hierarchical task manager with native XML support for custom reporting
具有本机XML支持的自定义报告的分层任务管理器
资料下载(Downloads)
- 最新的可执行文件+插件(8.0)(Latest Executable + Plugins (8.0)) -4.4 MB(包括所有关联的插件和资源)(- 4.4 MB (Includes all associated plugins and resources))
- 应用程序来源(8.0)(Application Source (8.0)) -3.4 MB(包括所有插件-在VC6,VS2005/2008/2010,VS2013,VS2015下编译)(- 3.4 MB (Includes all plugins - compiles under VC6, VS2005/2008/2010, VS2013, VS2015))
3(3)rd(rd)派对(Party)
注意(Note):如果有任何意见和问题,请直接联系相应的作者(: Please contact the respective authors directly with comments and questions)
- Tdl待办事项清单(Tdl Todo List) -适用于Android(- for Android)
- 编写ToDoList样式表(Writing ToDoList Stylesheets) -文章(- Article)
最新更新(8.0功能发布)(Latest Update (8.0 Feature Release))
-
新增功能-“报告编写者"导出器(New - ‘Report Writer’ exporter)
-
新增功能-“图形"任务视图(以前为"分解”)(New - ‘Graphs’ Task View (previously ‘Burndown’))
-
新增功能-” HTML注释"可提供更好的表格编辑和图像处理(New - ‘HTML comments’ offering better table editing and image handling)
-
新增-“工作量"任务视图(New - ‘Workload’ Task View)
-
新功能-“周计划者” 1天和3天视图(New - ‘Week Planner’ 1 and 3 Day views)
-
新增-“分数"自定义属性(New - ‘Fraction’ custom attribute)
-
新增-“费用率"自定义属性(前缀值为” @")(New - ‘Cost Rate’ custom attribute (prefix values with ‘@'))
-
新增功能-“工作时间"偏好设置(“任务>时间段”)(New - ‘Working Hours’ preferences (‘Tasks > Time Periods’))
-
新的-韩文(韩文)翻译(New - ‘Korean’ (Hangul) translation)
-
新增功能-用于编辑任务属性的"命令行选项”(New - ‘Command-line options’ for editing task attributes)
-
在"查看"菜单中添加了"激活任务视图"以支持键盘快捷键(Added ‘Activate Task View’ to ‘View’ menu to support keyboard shortcuts)
-
在"分析记录时间"中添加了"分组依据”(Added ‘Group By’ to ‘Analyse Logged Time’)
-
在属性下拉列表中添加了"自动完成”(Added ‘Auto-Complete’ to attribute droplists)
-
在"甘特图视图"中添加了"日期范围"滑块以控制可见的日期范围(Added ‘Date-Range’ slider to ‘Gantt View’ to control visible date range)
-
在"字体和颜色"首选项中添加了"颜色方案"(Added ‘Colour Schemes’ to ‘Fonts and Colours’ preferences)
-
在"查看"菜单中添加了"命名过滤器"以支持键盘快捷键(Added ‘Named Filters’ to ‘View’ menu to support keyboard shortcuts)
-
在"日历视图"首选项中添加了"热图"(Added ‘Heat Maps’ to ‘Calendar View’ preferences)
-
添加了"工作量"和"甘特图"视图示例任务列表(Added ‘Workload’ and ‘Gantt’ view example tasklists)
-
在"用户定义的工具"首选项"占位符"菜单中添加了"用户变量"和"自定义属性"(Added ‘User Variables’ and ‘Custom Attributes’ to ‘User Defined Tools’ preferences ‘Placeholder’ menu)
-
在"提醒"对话框中添加了"全部延后"按钮(Added ‘Snooze All’ button to ‘Reminder’ dialog)
-
在" UDT首选项"页面中添加了"选定的任务路径"占位符(Added ‘Selected Task Path’ placeholder to ‘UDT Preferences’ page)
-
在"自定义属性"中添加了"负数"支持(Added ‘Negative number’ support to ‘Custom Attributes’)
-
在"信息提示"中添加了"注释"(Added ‘Comments’ to ‘Infotips’)
-
当然还有更多次要的改进和修复,不胜枚举…(And of course many more minor improvements and fixes too numerous to mention…)
介绍(Introduction)
您知道这是怎么回事-您开始一个项目并中途进行,发现必须解决一个或两个副项目,然后才能继续原始项目.(You know how it is - you start work on one project and halfway through, you find one or two side-projects crop up that have to be solved before you can continue on the original project.)
这是一个这样的项目,但又增加了一点曲折,它也开始了其作为附属项目的生命.这是发生了什么:(This is one such project with the added twist that it too started its life as a side-project. Here’s what happened:)
<提示波浪形屏幕效果>()
我只能想象这些行星一定是在(不对中)对齐的状态,因为几个月前的某个时候,我突然收到了我以前提交给CodeProject的四,五篇不同文章的电子邮件,其中一些要求功能和其他漏洞修复.(I can only imagine that the planets must have been in (mis-)alignment or something, because at one point a few months ago, I was suddenly fielding emails on four or five separate articles I had previously submitted to CodeProject, some asking for features and others for bug fixes.)
不管是愚蠢还是其他,我在很大程度上都同意了所有提出的观点,随后发现自己要解决14或15个独立的问题.(Foolishly or otherwise, I largely agreed with all the points raised, and subsequently found myself with fourteen or fifteen separate issues to resolve.)
这种情况也变得更糟,因为我试图使用CodeProject来跟踪我已经同意做的所有事情,这意味着我不得不不断拖拉每篇文章的评论部分,以提醒自己应该做的事情上.(The situation was also made worse because I was trying to use CodeProject to keep track of all the things I had agreed to do, meaning that I had to continuously trawl the comments section of each article to remind myself of what I was supposed to be working on.)
甚至到了我担心我无法交付某些东西的阶段-我知道这很愚蠢,但是你在那儿!(It even got to the stage where I was worrying that I’d fail to deliver on something - silly I know, but there you are!)
在纸上列出清单是朝着正确方向迈出的明确一步,但是由于我在同一台机器上进行所有编码,因此看起来有些不雅,无论如何,我们都知道摆在桌子上的关键纸张会发生什么情况,这样.(Keeping a list on paper was a definite step in the right direction, but since I do all my coding on the same machine, it seemed somewhat inelegant, and anyway, we all know what happens to crucial bits of paper left lying around on desks and such.)
下一步是在网上寻找一种可以满足以下要求的工具:(The next step was to hunt around on the web for a tool to meet the following requirements:)
- 简单的界面(Simple interface)
- 支持分层数据(Support for hierarchical data)
- 编号项目/子项目(Numbered items/subitems)
- 打开文件格式(Open file format)
- 免费软件(Freeware) 简单吧!(Simple, huh!)不(not)!(!)
我承认我没有花数周的时间进行搜索,但是对于普遍缺乏满足我需求的软件,我仍然感到惊讶.(I will admit that I did not spend weeks searching, but I am still surprised at the general lack of software matching my needs.)
经过反思,我认为原因可能很简单:人们已经习惯于"功能丰富"的商业软件,以至于他们自己来设计软件时(并非无理)认为他们也需要尽可能多地学习,通常会导致在菜单栏中隐藏许多基本功能的软件.(On reflection, I think that the reason may be simple: people are so used to commercial software being ‘feature-rich’ that when they come to design software themselves, they (not unreasonably) think they too need to cram as much in as possible, often leading to software where a lot of essential functionality is hidden away in the menu bar.)
所以,惊讶,惊讶,我决定自己写点东西.(So, surprise, surprise, I decided to write something myself.)
但是,可以公平地说,我最初并不打算将其发布在CodeProject上,而只是这样做,是因为我在解决一些非常有趣的问题上有很多乐趣,而这些都是我认为值得的.(However, it’s fair to say that I did not originally intend to post it on CodeProject and am only really doing so because I had a heap of fun solving some very interesting problems and these are what I think make it worth it.)
使用软件(Using the Software)
由于在界面中显式可见每个功能,因此我在这里几乎不需要说什么.(There’s really very little I need to say here since every feature/function is explicitly visible in the interface.)
但是,以下基本功能和遗漏清单可能会以某种方式回答出现的任何问题:(Nevertheless, the following list of basic capabilities and omissions may go someway to answering any questions that arise:)
- 文件以XML格式存储,(Files are stored in XML format with)**.xml(.xml)**文件扩展名.(file extension.)
- 尝试加载非任务列表文件通常会失败(除非您阅读代码以了解如何规避它).(Trying to load a non-tasklist file will generally fail (unless you read the code to see how to circumvent it).)
- 项目/子项目的数量仅受内存限制(尽管性能可能是耗尽内存之前的决定因素).(The number of items/subitems is limited only by memory (although performance may be the deciding factor before you exhaust memory).)
- 将父项标记为"完成"也会使子项变灰,但它们不会被禁用或自动标记为"完成".(Marking a parent item as ‘done’ will also gray-out child items, but they are not disabled or automatically marked as ‘done’.)
- 省略号(…)表示某项包含子项.(An ellipsis (…) indicates that an item has sub-items.)
- 所有项目都可以展开或折叠(通过双击).(All items can be expanded or collapsed (by double-clicking).)
- 顶层项目和子项目是使用不同的工具栏按钮创建的.(Top-level items and sub-items are created using different toolbar buttons.)
- 有特定于任务的上下文菜单.(There are task-specific context-menus.)
- 先前打开的任务列表将在启动时重新打开.(The previously open tasklists are re-opened on startup.)
- 关闭软件或将其最小化到系统托盘时,任务列表将自动保存.(The tasklist is automatically saved when closing the software or minimizing it to the system tray.)
- 任务的优先级显示为项目左侧的灰度框.(The priority of a task is shown as a grayscale box to the left of the item.)
兴趣点(Points of Interest)
这是我们正在讨论的附带项目的地方,我打算在其中的前两个方面撰写后续文章.(Here’s where we come to the side-projects I was talking about, the first two of which I intend to work up into follow-up articles.)
他们是:(They are:)
- “有序"树控件,其中包含用于显示物料编号的非客户装订线(The ‘ordered’ tree control, which incorporates a non-client gutter for displaying the item numbers).(.)这个想法源于我对树列表控件的替代设计的研究,但并没有通过创建包含树和列表的混合控件来解决.(The idea stemmed from research I did into alternative designs for a tree-list control, which did not solve it by creating a hybrid control incorporating a tree and a list.)
混合动力控制似乎是一个显而易见的解决方案,我怀疑很少有人会停止质疑它,但是它仍然令我印象深刻,因为它看起来太像是艰苦的工作,无法做到真正的优雅(“方钉"和"圆孔"弹簧心神).(The hybrid control seems such an obvious solution that I suspect few people have stopped to question it, but it has still always struck me as looking far too much like hard work to be truly elegant (‘square pegs’ and ‘round holes’ spring to mind).)
一种可能的想法是完全在树的非客户区域中实现"列表"部分.即,将右侧客户边缘向左移动,然后在结果非客户区域中渲染列表部分.(One possible idea is to implement the ‘list’ portion entirely in the non-client area of the tree. I.e., shift the right hand client edge to the left and then render the list portion in the resulting non-client area.)
尽管我还没有全面构建概念验证的方法,但是正是这种持续不断的思想争论促使我尝试通过在非客户区域中呈现项目/子项目编号来解决对编号项目和子项目的要求.(Whilst I’ve yet to get round to building a proof of concept, it was nevertheless this ongoing mental debate which prompted me to try to solve the requirement for numbered items and subitems by rendering the item/subitem numbers in the non-client area.)
无需赘述(因为这将是其后的文章),这就是我如何使其工作的方式:(Without going into too much detail (as this will subsequently be an article of its own), this is how I got it to work:)
- 处理(*Handle*) `TVM_INSERTITEM` 和(*and*) `TVM_DELETEITEM` 确切了解何时添加和删除项目.(*to know exactly when items are added and removed.*)
- 在这些处理程序中,重新计算显示最宽的"点状"项目/子项目编号所需的装订线宽度. (注意:这不一定只是最深的子项.)(*In these handlers recalculate the width of the gutter required to display the widest 'dotted' item/subitem number. (Note: this is not necessarily simply the deepest subitem.)*)
- 如果所需的装订线宽度发生变化,请致电(*If the required gutter width changes, call*) `SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER)` 强制Windows重新计算控件的非客户区.(*to force Windows to recalculate the non-client area of the control.*)
- 处理(*Handle*) `WM_NCCALCSIZE` 如果需要,则将左边框偏移所需的装订线宽度.(*when it does, and offset the left border by the required gutter width.*)
- 处理(*Handle*) `WM_NCPAINT` 画数字.(*for painting the numbers.*)
这必然是一个过分简化的过程,但它抓住了解决方案的本质,并且所剩下的几乎就是摆弄,以确保非客户区在正确的时间重绘以保持与客户区的同步.(This is necessarily an over-simplification, but it captures the essence of the solution, and all that essentially remains is lots of fiddling about to ensure the non-client area gets redrawn at the the right times to stay synchronized with the client area.)
- 将.RC控件定义数据直接嵌入到.cpp文件中,以打破对二进制资源的依赖(也称为"运行时对话框”)(Embedding .RC control definition data directly in a .cpp file to break the dependency on binary resources (a.k.a. ‘Runtime Dialogs’)).(.)这个想法已经浮出水面了一段时间,直到最近才变成可行的解决方案.(This is an idea that has been floating about for quite some time and which has only recently gelled into a workable solution.)
简而言之,问题是,如果您想利用Visual Studio中的资源编辑器(而不是谁),那么您很快就会陷入困境,不得不从编译成二进制文件的资源中加载对话框模板.(The problem, put simply, is that if you want to take advantage of the resource editor in Visual Studio (and who doesn’t), then you very quickly find yourself stuck with having to load dialog templates from resources compiled into the binary file.)
这进一步意味着,如果要在多个项目之间使用对话框,则需要在项目之间复制并粘贴对话框模板(This further means that if you want to make use of a dialog across multiple projects, then either you need to copy and paste the dialog template between project)**.RC(.RC)**文件,或者您需要将对话框构建到可以从中访问对话框的DLL中.(files, or you need to build the dialog into a DLL from which it can be accessed.)
“运行时对话框”(我给自己创造了一个活泼的标题)是一种解决方案,它巧妙地避开了在资源文件之间复制对话框资源的麻烦以及在DLL中封装对话框所涉及的额外工作(和维护).(‘Runtime Dialogs’ (a snappy title I coined myself) is a solution that neatly sidesteps both the nuisance of copying dialog resources between resource files and the extra work (and maintenance) involved in packaging dialogs in DLLs.)
它是这样的:(And it works like this:)
- 首先,您在资源编辑器中设计对话框模板,创建一个(*First, you design your dialog template in the resource editor, create a*) `CDialog` 使用类向导派生类,并像平常一样连接所有控件.(*derived class using class wizard, and wire up all the controls just as you normally would.*)
- 接下来,你(*Next, you*) `#include "runtimedlg.h"` 并更改的所有实例(*and change all instances of*) `CDialog` 至(*to*) `CRuntimeDlg` .(*.*)
- 然后,将控件定义部分从以下位置的适当部分剪切并粘贴:(*Then, you cut and paste the control definition section from the appropriate section in the*)**.RC(*.RC*)**文件并将其直接嵌入对话框的(*file and embed it directly in the dialog's*)**.cpp(*.cpp*)**文件作为静态字符串(进行一些调整以处理双引号等).(*file as a static string (with a bit of tweaking to handle double quotes and such like).*)
- 最后,在对话框的构造函数中,您只需调用(*Finally, in the constructor of your dialog, you simply call*) `CRuntimeDlg::AddRCControls(...)` 将控件定义作为字符串传递.(*passing the control definitions as a string.*)
- 和(*And*) `CRuntimeDlg` 负责其余部分,包括根据需要自动调整对话框的大小以适合控件布局.(*takes care of the rest including, if required, auto-sizing the dialog to suit the control layout.*)
我当然不建议这是在所有情况下都是"双赢"的解决方案,但是它的优点在于将对话框模板与对话框代码紧密结合在一起,这使得在多个项目之间共享对话框变得轻而易举.(I’m certainly not suggesting that this is a ‘win-win’ solution for all situations but it certainly has merits in its closer coupling of dialog template to dialog code which makes sharing dialogs across multiple projects a breeze.)
附注:如果这里不清楚,我用(P.S.: In case it’s not clear here, I used) CRuntimeDlg
创造(to create) CToDoCtrl
它将有序树以及优先级,日期和注释控件封装为单个易于实例化的控件.(which encapsulates the ordered tree together with the priority, date and comments controls as a single simple-to-instantiate control.)
我还建议在我的.NET端口中使用它们(I’m also proposing to use them in the .NET port of my)VC6的ProjectZip加载项(ProjectZip add-in for VC6).(.)
- 将XML文件嵌入到(Embedding the XML file in a) 网页(web page) .(.)这可能是整个项目中最令人满意的方面,因为这完全是意外的.(This is possibly the most satisfying aspect of the whole project because it was completely unexpected.)
我的意思是直到最近,我对DOM和XMLDOM的知识实际上还是不存在,因为这是因为我对DOM的呈现越来越感兴趣(What I mean is that, until recently, my knowledge of DOM and XMLDOM was virtually non-existent, as it’s only since I’ve become more interested in the presentation of) 抽象(Abstract)勺(Spoon) 我不得不去处理DOM和XMLDOM的各种实现.(that I’ve been forced to get to grips with the various implementations of DOM and XMLDOM out there.)
我很高兴地说,我的网站上的代码可以在IE 6.0,Netscape 7.1和Mozilla下运行,尽管要实现此目的需要自定义代码.(I’m pleased to say that the code on my site works under IE 6.0, Netscape 7.1, and Mozilla, although custom code was required to achieve this.)
可能对您有用的通用MFC类(Generic MFC Classes that may prove Useful to You)
下表列出了为该项目编写的各种实用程序类.只要您还包括任何类依赖项,它们都可以包含在任何MFC项目中.随意问与这些特定类别以及如何使用它们有关的任何问题.(The following table lists a wide range of utility classes written for this project. They can all be included in any MFC project provided you include any class dependencies too. Feel free to ask any questions relating to these specific classes and how to use them.)
|类名(Class Name)
|描述(Description)
|类依赖(Class Dependencies) (除了MFC)((apart from MFC))
CAboutDlg |
|可自定义的"关于"对话框,无需对话框资源.支持html编码文本(Customizable “About…’ dialog not requiring a dialog resource. Supports html encoded text)
| CRuntimeDlg, CRCCtrlParser
|
| CAutoComboBox
|仅将唯一项添加到下拉列表中,并随机排列列表,以便最后添加的项位于顶部(Adds only unique items to the drop list and shuffles the list so that the last added item is at the top)
| CHoldRedraw
|
| CAutoFlag
|在类实例的生存期内封装布尔变量的设置和取消设置(Encapsulates the setting and unsetting of a boolean variable thru the lifetime of the class instance)
||
| CColorButton
|非ownerdraw按钮,在按钮面上显示选定的颜色,并在单击时显示颜色对话框(Non-ownerdraw button that displays the selected colour on the button face and displays the colour dialog when clicked)
| CEnColorDialog
|
| CColorComboBox
|所有者绘制组合框,用于显示和选择用户定义的颜色(Owner-draw combobox for displaying and selecting user defined colours)
||
| CDateHelp
er
|封装了各种用于计算日期跨度和格式化的例程(Encapsulation of various rountines for calculating date spans and for formatting)
||
| CDeferWndMove
|Win32 API的封装(Encapsulation of the Win32 API)
||
| CDialogHelper
|重新实现(Re-implementation of the) CDialog
用户清除数字编辑(例如)时,DDX/DDV会避免出现MFC错误消息(DDX/DDV rountines to avoid the MFC error messages when the user clears a number edit (for instance))
||
| CDlgUnits
|封装(Encapsulates the) MapDialogRect
Win32 API(Win32 API)
||
| CDockManager
|用于管理一个弹出窗口与另一个弹出窗口的对接的类.(Class for managing the docking of one popup window to another.)
|* CSubclassWnd, CHoldRedraw, CAutoFlag
|
| CDriveInfo
|封装了用于查询驱动器,文件和磁盘空间的各种例程(Encapsulates various rountines for querying about drives, files and disk space)
||
| CEnBitmap
|增加支持(Adds support to) CBitmap
用于加载非bmp文件和资源.(for loading non-bmp files and resources.)
||
| CEnBitmapEx, CColorReplacer, CImageBlurrer, CImageColorizer, CImageContraster, CImageEmbosser, CImageFlipper, CImageGrayer, CImageLightener, CImageNegator, CImageResizer, CImageRotator, CImageSharpener, CImageShearer, CImageSysColorMapper, CImageTinter
|将图像处理功能添加到(Adds image manipulation funationality to) CEnBitmap
| CEnBitmap
|
| CEnColorDialog
|添加自定义颜色的保存和还原(Adds saving and restoring of custom colours to) CColorDialog
||
| CEnCommandLineInfo
|添加了用于提取和查询命令行开关的功能(Adds functions for extracting and querying commandline switches)
||
| CEnEdit
|将用户定义的按钮功能添加到(Adds user-defined button capabilities to) CEdit
| CMaskEdit, CThemed, CDlgUnits
|
| CEnToolBar
|增加了对使用备用资源或文件映像的支持(Adds support for using alternative resource or file images)
||
| CFileEdit
|在编辑控件中添加用于浏览和显示由文本表示的文件的按钮.还显示文件的小图标.(Adds buttons for browsing and displaying the file represented by the text in the edit control. Also shows the file’s small icon.)
| CEnEdit, CFolderDialog, CMaskEdit, CDlgUnits, CThemed, CSysImageList
|
| CHoldRedraw
|Encapsulates WM_SETREDRAW
||
| CHotKeyCtrlEx
|解决了许多行为问题,包括某些按键的处理(Fixes a number of behavioural problems including the handling of certain keypresses)
||
| CHotTracker
|跟踪光标在用户定义的窗口上的移动并根据需要发布事件消息(Tracks the cursor movement over user-defined windows and posts event messages as necessary)
|* CSubclassWnd,
|
| CLimitSingleInstance
|提供简单的方法来检测应用程序的另一个实例是否正在运行(Provides simple method to detect if another instance of an app is running)
||
| CMaskEdit
|向中添加简单的字符遮罩(Adds simple character masking to) CEdit
||
| CNcGutter
|允许通过支持将任意数量的列添加到窗口的非客户区域来扩展标准窗口控件的UI.支持列表,树等表格控件(Allows the UI of standard windows controls to be extended by supporting any number of columns to be added to the non-client area of the window. Favours tabular controls like lists, trees, etc)
|* CSubclassWnd, CHoldRedraw, CThemed, CDlgUnits
|
| COrderedTreeCtrl
| CTreeCtrl
实施(implementation of) CNcGutter
显示一列,以” 1.2.3.4"符号表示每个树项的层次结构位置.(displaying a single column showing the hierarchical position of each tree item in ‘1.2.3.4’ notation.)
| CHoldRedraw, CThemed
|
| CPasswordDialog
|非常简单的密码对话框,不需要对话框资源(Very simple password dialog not requiring a dialog resource)
| CRuntimeDlg, CRCCtrlParser
|
| CPropertyPageHost
|更简单的替换(Simpler replacement for) CPropertySheet
允许更轻松地创建为子窗口(allowing easier creation as a child window)
||
| CRCCtrlParser
|使用者(Used by) CRuntimeDlg
用于解析对话框资源类文本(for parsing dialog resource-like text)
||
| CRuntimeDlg
|增加支持(Adds support to) CDialog
用于在运行时建立对话框,即.对话框不需要对话框资源(for building dialogs at runtime ie. dialogs do not require a dialog resource)
| CRCCtrlParser
|
| CShortcutManager
|用于处理应用程序键盘快捷键的类.(Class for handling application keyboard shortcuts.)
|* CSubclassWnd, CWinClasses
|
| CSpellCheckDlg
|拼写检查对话框不需要对话资源,该资源可与(Spellcheck dialog not requiring a dialog resource, which interfaces with) ISpellCheck
(Open Office词典的界面)((interface to Open Office dictionaries))
| CRuntimeDlg, CRCCtrlParser, ISpellCheck
|
| CSysImageList
|封装Windows系统映像列表(文件/文件夹映像)(Encapsulates the Windows system image list (file/folder images))
||
| CTabCtrlEx
|在不使用owner-draw的情况下为选项卡添加后期渲染回调(Adds post rendering callback for the tabs without using owner-draw)
||
| CThemed
|封装主题(XP)和非主题(其余)的Windows控件图形(Encapsulates themed (XP) and non-themed (the rest) drawing of windows controls)
||
| CTimeEdit
|添加了用于指定时间单位的按钮,并提供了用于在不同时间单位之间来回转换时间的例程(Adds a button for specifying time units and provided routines for converting time to and from different time units)
| CEnEdit, CMaskEdit, CThemed, CDlgUnits
|
| CToolbarHelper
|增加了对对话框工具栏工具提示,多行工具提示以及带有菜单的下拉按钮的支持(Adds support for dialog toolbar tooltips, multiline tooltips and dropbuttons with menus)
|* CSubclassWnd, CEnBitmap, CEnBitmapEx
|
| CTrayIcon
|封装(Encapsulates the) Shell_NotifyIcon
Win32 API.还提供气球提示和动画(Win32 API. Also provides balloon tips and animation)
|* CSubclassWnd
,
|
| CUrlRichEditCtrl
|增加了对识别URL,单击它们并设置自定义URL回调的支持(Adds support for recognizing urls, clicking them and setting custom url callbacks)
||
| CWinClasses
|封装::(Encapsulates the ::) GetClassName
Win32功能(Win32 functions)
||
| CXmlFile, CXmlItem
|用于读取和写入xml文件的非Unicode类(Non-Unicode class for reading and writing xml files)
||
| CXmlFileEx
|将加密功能添加到(Adds encryption capabilities to) CXmlFile
| CXmlFile, IEncryption
|
(**)CSubclassWnd最初由Paul DiLascia为MSJ杂志撰写.我使用的版本已进行了大量扩展以满足我的特定需求.这里依赖它的类需要此扩展版本.(CSubclassWnd was originally written by Paul DiLascia for MSJ magazine. The version I use has been heavily extended to suit my specific needs. The classes that depend on it here need this extended version.)
进一步的工作(Further Work)
虽然此工具最初仅供我个人使用,但现在是一个"社区"项目,因此,如果您发现它有用,并且想为增强功能或错误修复提供建议,请发布到我们的(Whilst this tool was originally intended for my personal use only, it is now a ‘community’ project, so if you find it useful and want to make suggestions for enhancements or bug fixes, please post to our) Google群组(Google Group) .(.)
历史(History)
- 现在举行的历史(History now held at)我们的(our) Google群组(Google Group)
- 1.1-7.1(1.1-7.1)((()被.dan.g.删除(removed by .dan.g.))())
- 1.0(1.0)(2003年11月4日)((4 Nov 2003))
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
VC7.0 VC7.1 VC6 WinXP Win2003 Win2K Visual-Studio Win32 Architect CEO 新闻 翻译