2013-05-01 4 views
0

У меня есть список VB6 в режиме подробной информации, отображающий X количество элементов. Я хочу создать какую-то функцию авто-высоты, которая оценивает высоту на основе указанной ширины и количества элементов.WinApi: Рассчитать высоту ListView

Следующий код не сработал:

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 

Может кто-нибудь помочь мне с этим?

+1

Как это не работает? – Deanna

+0

возвращено 65535 на низкое слово и 0 для привет-слова. – user884248

+0

Подтвердите свой комментарий в терминах значений ваших переменных. –

ответ

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

+0

спасибо - ты мне очень помог! – user884248

Смежные вопросы