当后续列具有图像时,列表控件将图像的空间添加到列0

时间:2010-08-24 19:36:18

标签: windows listview mfc controls

我遇到了Windows列表控件的问题(我专门使用MFC,但看起来它适用于Windows公共控件库中的所有列表控件)。

在我的特定情况下,我想创建一个包含两列或更多列的列表控件。第一列(0)是纯文本的,用于允许用户通过在该行中键入文本来跳转到条目。第二列(或三个,或四个,或其他)有一个图像(或图像和文本;无论哪种方式)。

这一切都很好,可以很容易地完成,但最终的列表控件最终在第0列的文本左侧有一个空格(它可能在RTL系统的右侧) 。这个间隔似乎是为图像保留的,我无法找到防止它的方法。 (排列列的特定顺序没有任何改变。)

环顾四周,我发现其他人抱怨同样的事情,特别是this thread导致this thread。建议的解决方案不起作用,因为如上所述,简单地缩小列零的宽度只是切断文本而不是图像间隔(加上,然后你必须防止和/或处理用户尝试的列宽的任何更改使)。

有没有人知道如何修复这个错误,而不是从头开始编写列表控件或使用CodeProject / CodeGuru /等上过于花哨的网格控件之一?

非常感谢。

2 个答案:

答案 0 :(得分:0)

您是否尝试更改iIndent结构的LVITEM成员? MSDN说:

  

iIndent
版本4.70。缩进项目的图像宽度数。一个   单个缩进等于宽度   项目图片。因此,值1   将项目缩进宽度为1   图像,值2缩进两个   图像,等等。请注意这一点   仅支持项目的字段。   试图设置子项缩进   将导致调用函数   失败。

答案 1 :(得分:0)

列0在ListView中是特殊的。一旦将小图像列表分配给ListView,控件就会要求您在第0列中显示图像,因此它会为其留出空间。

解决方案:

  1. 使第0列为零宽度,为其提供您希望用户能够键入的值。第1列成为“第一个”文本列。第2列以上适用于您的图像。您需要完整的行选择样式才能工作。是的,您必须阻止用户调整第0列的大小。是的,这很痛苦。
  2. 创建一个图像为列0的列,并使用LVM_SETCOLUMNORDERARRAY重新排列显示顺序
  3. 所有者绘制物品。
  4. 给第0列一个图标(只是为了涵盖所有基础)