WinApi:计算ListView高度

WinApi:计算ListView高度,winapi,listview,vb6,Winapi,Listview,Vb6,我有一个在细节模式下的VB6列表视图,显示X个项目数。我想创建某种自动高度函数,根据指定的宽度和项目数计算高度 以下代码不起作用: Public Declare Function MessageSend Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const LVM_FIRST As L

我有一个在细节模式下的VB6列表视图,显示X个项目数。我想创建某种自动高度函数,根据指定的宽度和项目数计算高度

以下代码不起作用:

Public Declare Function MessageSend Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const LVM_FIRST As Long = &H1000
Public Const LVM_APPROXIMATEVIEWRECT    As Long = (LVM_FIRST + 64)

Public Sub GetAutoWidth(lvw as ListView)
    result = MakeLPAram(-1, 0)
    MessageSend lvw.hWnd, LVM_APPROXIMATEVIEWRECT, -1&, result
    lvw.height = loWord(result) * Screen.TwipsPerPixelX
End Sub

Public Function LoWord(value As Long) As Long
    LoWord = (value And &HFFFF&)
End Function

Public Function MakeLPAram(wLow As Long, wHigh As Long) As Long
    MakeLPAram = MakeLong(wLow, wHigh)
End Function

Public Function MakeLong(wLow As Long, wHigh As Long) As Long
    MakeLong = LoWord(wLow) Or (&H10000 * LoWord(wHigh))
End Function

有人能帮我吗?

首先,您不在此处保存消息的返回值:

MessageSend lvw.hWnd, LVM_APPROXIMATEVIEWRECT, -1&, result
您应该这样做,因为返回值正是您首先发送消息的原因:

返回值

返回保留近似宽度的DWORD值(以低位表示) 以及显示项目所需的高度(在HIWORD中),以像素为单位

其次,您的命名(
GetAutoWidth
)、问题标题(“计算ListView高度”)和代码(
lvw.height=loWord(result)*Screen.twipperpixelx
)非常不一致

第三,请阅读以下MSDN文章,因为您的打包/解包单词代码和双字代码也有缺陷:


返回65535表示低位词,0表示高位词。请根据变量值重申您的评论。