【问题标题】:TopenDialog/TSaveDialog with owner-drawn items带有自绘项的 TopenDialog/TSaveDialog
【发布时间】:2012-08-20 21:23:51
【问题描述】:

我想实现传统的打开和保存对话框(以及正在处理的底层项目是文件),但我想控制显示的内容来代替文件名,并包含一些图形 - 即我需要一个“ownerdraw”样式的对话框。除了这方面,我希望对话框的外观和感觉尽可能像传统的打开/保存对话框。

我想我自己也面临着实现这一点,我只是想知道最好的起点是哪里。

【问题讨论】:

  • @Jay,我认为通用对话框不支持这个问题所要求的自定义级别。 rossmcm,我将从 TVirtualTreeView 开始;它允许轻松使用自定义图像,使用每个节点存储自定义数据,在树视图或列表视图(网格)模式下工作,并使用按需加载来减少内存使用。它是免费的,带有源代码。我手头没有当前链接,但可以通过 Google 快速搜索找到它。
  • 哦,是 ListView 项。在这种情况下,将需要 Windows Hook 和子类化。
  • 用什么替换文件名才有意义?
  • (@David 我知道有人会这样问;))。与其说是替换不如说是增强。例如,如果文件名引用了一个应用程序数据文件,我可以根据文件中的数据显示一个字形。另一个原因可能更具争议性。我正在考虑在文件名中允许使用非法字符 - 这样用户可以将他们的数据保存在“我的项目 ”中 - 然后我会将名称更改为“我的项目 &lt1&gt”,以便命名实际文件.然后,我将解构文件名以显示在文件加载/保存对话框中。
  • 这两个都是坏主意。已经有根据内容自定义字形的方法。使用它们,所有 shell 视图都将受益,而不仅仅是在您的应用程序中。同样的文件名。如果您不向用户显示真实的文件名,他们如何通过其他方式获取该文件。不要与系统抗争,顺其自然。

标签: delphi delphi-2006 ownerdrawn topendialog tsavedialog


【解决方案1】:

AFAIK 标准窗口对话框不提供您需要的自定义级别,但您可以尝试 TShellListView(TCustomShellListView) 组件,它是 ShellCtrls 单元的一部分(此包未安装在 Delphi IDE 中默认),从这里您可以获取代码以使用文件夹内容填充您自己的 TListview 并根据需要绘制项目,还可以查看 Shell Interfaces 与 shell 的元素进行交互。

【讨论】:

  • 另外,请注意这些组件中存在相当多的错误(至少在 Delphi 2007 之前,我还没有检查过更高版本)
【解决方案2】:

对于用作列表视图的所有者绘制控件,我推荐 Roy Klever 的 rkSmartView。

http://rmklever.com/?page_id=299

Roy 在上面的博客上发布的演示应用程序包含一个相当不错的图形缩略图浏览器示例,它可以变成您正在做的事情的核心。他添加了“星级”评级和各种其他自绘装饰。

http://rmklever.com/?p=318

所有者在像 TListView 这样的标准公共控件上绘制是充满限制的。如果您想拥有控件的全部或部分内容,那么 100% 内部绘制并提供 100% 源代码的完全虚拟控件是确保您不会碰壁或最终得到 98% 解决方案的唯一方法你不能一路带回家。

我最近通过修改上述组件做了类似的事情,结果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2011-09-08
    • 2013-06-21
    • 2018-07-12
    相关资源
    最近更新 更多