虚拟 CListCtrl 自动大小

Posted

技术标签:

【中文标题】虚拟 CListCtrl 自动大小【英文标题】:Virtual CListCtrl Auto Size 【发布时间】:2013-11-03 07:56:53 【问题描述】:

我想自动调整虚拟 ClistCtrl(LVS_OWNERDATA 标志)的列大小。

我在一些论坛发现虚拟列表不能使用“LVSCW_AUTOSIZE”选项。有些人建议改为实现算法。

但是一旦加载了我的 ClistCtrl 而没有任何调整大小选项,双击标题分隔符可以正确调整可见列的大小。

那么,我该如何执行“HDN_DIVIDERDBLCLICKW”调用的函数呢?

【问题讨论】:

【参考方案1】:

Clements 建议的自动调整大小适用于普通列表控件,但不适用于虚拟列表控件(因为控件对列数据一无所知)。您必须自己提供数据列宽。

【讨论】:

没错! autosize 不适用于虚拟列表。但是双击标题分隔符可以完成任务,即使在虚拟列表中也是如此。因此,即使是虚拟列表,也有一个知道列数据大小的函数。我的问题是关于那个功能的。【参考方案2】:

从this Codeproject article,您应该能够使用以下内容自动调整列的大小:

pListCtrl->SetColumnWidth(i, LVSCW_AUTOSIZE);
int nColumnWidth = pListCtrl->GetColumnWidth(i);
pListCtrl->SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);
int nHeaderWidth = pListCtrl->GetColumnWidth(i); 
pListCtrl->SetColumnWidth(i, max(nColumnWidth, nHeaderWidth));

您可能需要处理the LVN_GETDISPINFO notification 以向虚拟列表控件提供必要的数据,不过...

【讨论】:

Autosize 不适用于虚拟列表。但是,即使使用虚拟列表,双击标题分隔符也可以完成任务。然后某处存在像“autosize”(适用于虚拟列表)之类的功能。我的问题是关于那个功能的。

以上是关于虚拟 CListCtrl 自动大小的主要内容,如果未能解决你的问题,请参考以下文章

MFC CListctr显示缩略图

MFC ClistCtr锁定隐藏某一列

MFC总结之CListCtrl用法及技巧

虚拟列表控件 CListCtrl

在 vc++ 中重新调整任何 clistctrl 列的大小时避免使用补丁

如何停止显示 CListCtrl 的底部滚动条?