我想得到的是ListView
控件的大小,但不是显示的大小,而是当它完全展开时的大小(即没有任何滚动条)。这可能吗?我该如何计算呢?
编辑:我想要完成的是调整控件的大小,以便不需要滚动(包含此控件的面板,还有一些可滚动)
答案 0 :(得分:0)
如果您正在谈论详细信息视图:
如果你正在谈论控制的高度,我建议不要这样做。有关基本原理,请参阅this discussion。
如果您正在讨论控件的宽度,则需要将每列的宽度相加。那边有两个像素的边框 - 我相信你可以确定它来自哪里。
int width = 2 * 2;
foreach (ColumnHeader column in this.listView1.Columns)
{
width += column.Width;
}
this.listView1.Width = width;
答案 1 :(得分: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以使用当前值。因为你没有方便的宏,所以你需要做一些小事。bit-twiddling函数示例:
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));
}