Excel VBA自动调整ListView列宽

3
我找到了一段代码,可以根据列中项目的最长字符串来调整ListViews列的大小,但我想修改它,使其也考虑列名的长度来进行调整。我有几列,其中最长的字符串就是列名本身。
我已经在谷歌上搜索了很久,但我真的不理解这里使用的API。
对这个问题的扩展还包括,LVM_FIRST 在这里做什么,我在搜索中似乎找不到任何信息。
声明:
Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long

Private Const LVM_FIRST = &H1000

主题:

Public Sub LV_AutoSizeColumn(LV As ListView, Optional Column _
 As ColumnHeader = Nothing)

 Dim C As ColumnHeader
 If Column Is Nothing Then
  For Each C In LV.ColumnHeaders
   SendMessage LV.hWnd, LVM_FIRST + 30, C.Index - 1, -1
  Next
 Else
  SendMessage LV.hWnd, LVM_FIRST + 30, Column.Index - 1, -1
 End If
 LV.Refresh

End Sub
1个回答

0

LVM_FIRST + 30LVM_SETCOLUMNWIDTH消息,用于设置给定列的宽度。

-1LVSCW_AUTOSIZE,表示控件根据内容调整大小。如果您切换到-2LVSCW_AUTOSIZE_USEHEADER),则控件将调整为标题文本。

在循环中同时设置两者,注意哪个导致ColumnHeaders宽度更大,然后再次使用适当的LVSCW_参数发送SendMessage


我在这方面还是很新手。您能详细说明一下“set both”是什么意思,然后再发送消息吗?您是指将较大的值存储在变量中吗? - Zionmoose
1
我本来想粘贴一个演示,但看起来USEHEADER尊重更长的列值,所以请尝试用SendMessage LV.hWnd,LVM_FIRST + 30,C.Index - 1,ByVal -2替换您现有的SendMessage - Alex K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接