kk_lee69 发表于 2020-8-2 22:45:15

如何得知 LISTVIEW 的可见范围内的 SubItem 各是多少??[已解決]

本帖最后由 kk_lee69 于 2020-8-6 19:54 编辑

LISTVIEW 比较小 项目比较多时,通常我们会移动下面的滚动条
此时如何得知 最左边 与最右边的 subItem 是哪个??
有人研究过这个吗??











#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Example()
Func Example()
    Local $listview, $button, $item1, $item2, $item3, $msg
    GUICreate("列表視圖項目", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
    GUISetBkColor(0x00E0FFFF) ; 改變背景顏色
    $listview = GUICtrlCreateListView("列0    |列1   |列2   |列3   |列4    |列5    |列6    |列7   |列8", 10, 10, 200, 150);,$LVS_SORTDESCENDING)
    $button = GUICtrlCreateButton(" LISTVIEW可見範圍的SUBITEM 為: ", 10, 170, 200, 20)
    $item1 = GUICtrlCreateListViewItem ("項目 2|列22|列23", $listview)
    $item2 = GUICtrlCreateListViewItem ("............項目 1|列12|列13", $listview)
    $item3 = GUICtrlCreateListViewItem ("項目 3|列32|列33", $listview)
    GUICtrlCreateInput("", 20, 200, 150)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; 允許拖放
    GUISetState()
    GUICtrlSetData($item2, "|項目 1")
    GUICtrlSetData($item3, "||列33")
    GUICtrlDelete($item1)
    Do
      $msg = GUIGetMsg()
      Select
            Case $msg = $button
               
            Case $msg = $listview
                MsgBox(0, "列表視圖", "點擊列=" & GUICtrlGetState($listview), 2)
      EndSelect
    Until $msg = $GUI_EVENT_CLOSE
EndFunc   ;==>Example



afan 发表于 2020-8-2 23:03:18

用 _GUICtrlListView_GetSubItemRect() 试试~

kk_lee69 发表于 2020-8-2 23:56:54

afan 发表于 2020-8-2 23:03
用 _GUICtrlListView_GetSubItemRect() 试试~

這個有試過只能判斷出 左邊的 因為 超出可視範圍的 subitem 的座標會是 負的可以判斷

但是右邊的 就無法理解跟判斷了

afan 发表于 2020-8-3 00:02:48

#include <WindowsConstants.au3>
#include <GuiListView.au3>

Example()
Func Example()
        Local $listview, $button, $item1, $item2, $item3, $msg, $iInput
        GUICreate("列表視圖項目", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
        $listview = GUICtrlCreateListView("列0    |列1   |列2   |列3   |列4    |列5    |列6    |列7   |列8", 10, 10, 200, 150);,$LVS_SORTDESCENDING)
        $button = GUICtrlCreateButton(" LISTVIEW可見範圍的SUBITEM 為: ", 10, 170, 200, 20)
        $item1 = GUICtrlCreateListViewItem("項目 2|列22|列23", $listview)
        $item2 = GUICtrlCreateListViewItem("............項目 1|列12|列13", $listview)
        $item3 = GUICtrlCreateListViewItem("項目 3|列32|列33", $listview)
        $iInput = GUICtrlCreateInput("", 20, 200, 150)
        GUISetState()
        Do
                Switch GUIGetMsg()
                        Case $button
                                GUICtrlSetData($iInput, _GetLVWSubVisible($listview, 200))
                        Case -3
                                Exit
                EndSwitch
        Until 0
EndFunc   ;==>Example
Func _GetLVWSubVisible($idListview, $iW)
        Local $ii, $aRect, $ixL = -1, $ixR
        Local $iCC = _GUICtrlListView_GetColumnCount($idListview)
        For $ii = 1 To $iCC - 1
                $aRect = _GUICtrlListView_GetSubItemRect($idListview, 0, $ii)
                If ($aRect + $aRect) < 1 Then ContinueLoop
                If $ixL < 0 Then
                        If $aRect > 1 Then
                                $ixL = $ii - 1
                        Else
                                $ixL = $ii
                        EndIf
                EndIf
                If $aRect >= $iW Or $ii = ($iCC - 1) Then
                        $ixR = $ii
                        ExitLoop
                EndIf
        Next
        Return $ixL & ' - ' & $ixR
EndFunc   ;==>_GetLVWSubVisible

afan 发表于 2020-8-3 00:07:22

另外你可以设置露出的阈值,比如露出20才算。根据你的程序用途自行调节吧。

kk_lee69 发表于 2020-8-3 00:22:51

afan 发表于 2020-8-3 00:07
另外你可以设置露出的阈值,比如露出20才算。根据你的程序用途自行调节吧。

ㄟ厲害喔

我研究一下感謝 afan 老大   幫了大忙!!

kk_lee69 发表于 2020-8-3 00:51:39

afan 发表于 2020-8-3 00:07
另外你可以设置露出的阈值,比如露出20才算。根据你的程序用途自行调节吧。

老大這個方法可用 細節我在處理不過我現在 遇到一個困難 就是$iW參數 我需鰾變成活動的,因為我的程式裡面 會有各式各樣的 LISTVIEW 每個大小都不一定

我如何從LISTVIEW 的句柄 知道 他的 可視範圍寬度

afan 发表于 2020-8-3 00:59:36

kk_lee69 发表于 2020-8-3 00:51
老大這個方法可用 細節我在處理不過我現在 遇到一個困難 就是$iW參數 我需鰾變成活動的,因為我 ...

句柄的话用 WinGetPos() 就行了...
WinGetPos(GUICtrlGetHandle($listview))
页: [1]
查看完整版本: 如何得知 LISTVIEW 的可见范围内的 SubItem 各是多少??[已解決]