0

詳細モードの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

誰でもこれで私を助けることができますか?

4

1 に答える 1

1

LVM_APPROXIMATEVIEWRECTまず、ここではメッセージの戻り値を保存しません:

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

最初にメッセージを送信する理由はまさに戻り値であるため、次のようにする必要があります。

戻り値

項目を表示するために必要なおおよその幅 (LOWORD 内) と高さ (HIWORD 内) を保持する DWORD 値をピクセル単位で返します。

第 2 に、名前付け ( GetAutoWidth)、質問のタイトル (「ListView の高さを計算する」)、およびコード ( lvw.height = loWord(result) * Screen.TwipsPerPixelX) に一貫性がありません。

3 番目に、次の MSDN の記事を読んでください。単語とダブルワードをパック/アンパックするためのコードにも欠陥があります。

VB で HIWORD、LOWORD、HIBYTE、LOBYTE C マクロを模倣する方法

HiWord/LoWord 値を長いパラメーターにパッケージ化する方法

于 2013-05-01T23:38:39.597 に答える