2013-05-01 1 views
0

세부 모드에서 VB6 listview를 사용하여 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 

당신해야, 당신이 처음에 메시지를 보내 왜 반환 값은 정확히 같이

반환 값

대략적인 너비 (LOWORD) 과 항목을 표시하는 데 필요한 높이 (HIWORD)를 픽셀 단위로 저장하는 DWORD 값을 반환합니다.

둘째, 당신의 이름 (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