2011-03-25 25 views
0

我想得到的是一个ListView控件的大小,但不是显示的大小,而是当它完全展开(即没有任何滚动条)时它的大小。这可能吗?我如何计算这个?没有滚动条的ListView的内部大小

编辑:我试图做到的是要调整该控件,以便它不需要滚动(含面板此控制和一些更多的是滚动)

+0

的HTML DIV大小或?这里有点困惑 – jebberwocky 2011-03-25 10:15:25

+0

你想完成什么? – 2011-03-25 10:18:48

+0

@jebberwocky - 阅读标签... @cody - 添加信息,也许这将有助于 – Migol 2011-03-25 10:45:21

回答

0

这是相当难以用ListView控制来完成的,特别是如果你有它设置为“详细信息”视图。有没有简单的方法来确定列标题的大小。如果您的目标是Windows Vista或更高版本,最简单的答案是设置LVS_EX_AUTOSIZECOLUMNS extended style,该选项会自动调整ListView中显示的列的大小,以最好地适合屏幕上的数据。

要考虑的另一个选择是发送LVM_APPROXIMATEVIEWRECT message,该文件记录为返回ListView控件所需的大概高度和宽度,以显示指定数量的项目。我从来没有真正使用过这个,但它看起来很有希望。我不确定它是如何工作的“详细信息”视图,但它应该至少适用于其他图标视图。

你需要P/Invoke才能在.NET中使用它。这些定义将帮助你开始:

private const int LVM_FIRST = 0x1000; 
private const int LVM_APPROXIMATEVIEWRECT = LVM_FIRST + 64; 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 
  • 指定的句柄ListView控制(myListView.Handle)作为hWnd参数。
  • msg参数当然是LVM_APPROXIMATEVIEWRECT
  • 该文档说,可以将wParam设置为-1以使用控件中的项目总数。
  • lParam的低位字是控件的建议x维,以像素为单位。高阶词是提议的y维。可以将其设置为-1以使用当前值。由于您没有方便的宏,因此您需要进行一些调整。
  • 而且返回值包含低位字中的宽度和高位字中的高度。同样,你需要通过一些小小的操作来提取这些值。

实施例位变换功能:

public static int LoWord(IntPtr dw) 
{ 
    return (dw.ToInt32() & 0xffff); 
} 

public static int HiWord(IntPtr dw) 
{ 
    return ((dw.ToInt32() >> 16) & 0xffff); 
} 

private static IntPtr MakeLParam(int loWord, int hiWord) 
{ 
    return (IntPtr)((hiWord << 16) | (loWord & 0xffff)); 
} 
0

如果你在谈论细节查看:

如果你正在谈论控件的高度,我建议不要这样做。有些基本原理见this discussion

如果你正在谈论控制的宽度,那么你需要加上每列的宽度。在每边有2个像素的地方有一个边框 - 我相信你可以确定它来自哪里。

int width = 2 * 2; 
foreach (ColumnHeader column in this.listView1.Columns) 
{ 
    width += column.Width; 
} 

this.listView1.Width = width;