自定义控件,winapi
Posted
技术标签:
【中文标题】自定义控件,winapi【英文标题】:Custom controls, winapi 【发布时间】:2016-08-12 04:05:27 【问题描述】:有人可以告诉我,在winapi中将进度条作为treeView控件的一部分是否现实?我用 GTK 制作了一个 GUI,并使用进度条作为单元格的元素效果很好,如图所示。
我没有开发自定义控件的经验,所以我想知道,能够像使用 Winapi 的 GTK 那样做一些事情是否现实,还是会浪费时间?
【问题讨论】:
【参考方案1】:如果您想在非树状数据表中显示进度条,则不必求助于自定义控件。典型的解决方案是在报告模式下使用标准的 Windows API 列表视图控件,它提供 GtkTreeView 提供的表格视图,对提供进度信息的列使用“所有者绘制”。如何做到这一点有很好的记录,但它涉及从其父窗口的窗口过程中的列表视图中侦听WM_NOTIFY
,寻找NM_CUSTOMDRAW
通知。 NM_CUSTOMDRAW
通知附带了绘制单个单元格甚至是列表视图的整行所需的一切。只需确定这是您要绘制的列,绘制它,然后让系统绘制其他所有内容。
但是,如果您要使用树,而不仅仅是一张平面桌子,那么您将有更多工作要做。 GtkTreeView 允许您拥有多列树,但 Windows API 库存控件只允许您拥有多列表(列表视图)或单列树(树视图)。如果你想要的话,有像 mCtrl 这样的包可以为你提供一个多列树控件,它们的工作方式与 List View 控件类似,所以你也可以使用上面的自定义绘制方法。
(你可以把 List View 想象成 GtkTreeViewColumns 的 GtkTreeView,它有一个 GtkCellArea,其中最多有一个 GtkCellRenderPixbuf 和一个 GtkCellRendererText,第一列也最多有一个 GtkCellRendererToggle。同样,你可以想象一个树视图作为 GtkTreeView,只有一个 GtkTreeViewColumn 和不可见的列标题,最多有一个 GtkCellArea,每个 GtkCellRendererToggle、GtkCellRendererImage 和 GtkCellRendererText。)
我不熟悉任何已经存在的、模仿 GtkTreeView 使用的单元格渲染器系统的预构建自定义控件。列表视图和树视图控件没有这样做,因为缺乏必要性和为这些控件编写的情况增加了复杂性(资源管理器)。 (我一直在做我自己的一个,但我一直很忙,所以我不知道什么时候会完成。)
【讨论】:
非常感谢,@andlabs!你已经发布了我想知道的所有内容!我应该在报告模式下使用 listveiw。谢谢! 在 Win32 中可以使用多列树,只需 custom-drawing a standard TreeView。 @RemyLebeau 嗯...如果您也想拥有一个标题控件,树视图是否也能很好地发挥作用?我没有看到任何消息,比如更改树视图区域的顶部像素。 @andlabs 标准 TreeView 没有像 ListView 那样的内置 Header 控件。但是您可以创建一个单独的 Header 控件放置在 TreeView 上方,并让 Header 列定义您的 TreeView 绘图的边界。以上是关于自定义控件,winapi的主要内容,如果未能解决你的问题,请参考以下文章