【问题标题】:WinApi: Calculate ListView heightWinApi:计算 ListView 高度
【发布时间】:2013-05-02 07:59:46
【问题描述】:

我有一个详细模式下的 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

谁能帮我解决这个问题?

【问题讨论】:

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

标签: winapi listview vb6


【解决方案1】:

首先,你不要在这里保存LVM_APPROXIMATEVIEWRECT消息的返回值:

MessageSend lvw.hWnd, LVM_APPROXIMATEVIEWRECT, -1&, result

您应该这样做,因为返回值正是您首先发送消息的原因:

返回值

返回一个包含近似宽度的 DWORD 值(在 LOWORD 中) 和显示项目所需的高度(在 HIWORD 中),以像素为单位。

第二,你的命名(GetAutoWidth),你的问题标题(“计算ListView高度”),和你的代码(lvw.height = loWord(result) * Screen.TwipsPerPixelX)很不一致。

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

How to Mimic HIWORD, LOWORD, HIBYTE, LOBYTE C Macros in VB

How To Package HiWord/LoWord Values Into a Long Parameter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多