Всем доброго времени суток!
Помогите создать виртуальный ListView для двумерного массива, например для 3-х столбцов.
Для одномерного массива я делал так:
Как изменить функцию WM_NOTIFY для двумерного массива, например для 3-х столбцов
Помогите создать виртуальный ListView для двумерного массива, например для 3-х столбцов.
Для одномерного массива я делал так:
Код:
; Виртуальный ListView
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <Array.au3>
#include <ButtonConstants.au3>
#include <GuiListView.au3>
Global $hGui, $hEdit, $idEditSearch, $hLV, $iItems = 100000, $aItems[$iItems]
; Создаем массив
For $i = 0 To $iItems - 1
$aItems[$i]='СтрокаI '&$i+1
Next
; Просмотр элементов массива в Виртуальном ListView
_ArrayVirtualDisplay($aItems)
Func _ArrayVirtualDisplay($aItems)
; Create GUI
$hGui = GUICreate( "Virtual ListView", 300, 230 )
Local $Button1 = GUICtrlCreateButton("Button1", 10, 8, 75, 25)
; Create ListView
Local $idLV = GUICtrlCreateListView( "", 10, 40, 300-20, 200-20, BitOR($LVS_OWNERDATA,$LVS_SHOWSELALWAYS) )
_GUICtrlListView_SetExtendedListViewStyle($idLV, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
$hLV = GUICtrlGetHandle( $idLV ) ; Virtual listview Reduces flicker
_GUICtrlListView_AddColumn( $hLV, "Items", 100 )
; Handle $WM_NOTIFY messages from ListView
; Necessary to display the rows in a virtual ListView
GUIRegisterMsg( $WM_NOTIFY, "WM_NOTIFY" )
; Display items
GUICtrlSendMsg( $idLV, $LVM_SETITEMCOUNT, $iItems, 0 )
GUISetState(@SW_SHOW)
; Message loop
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$hLV = GUICtrlGetHandle( $idLV )
$IndexListView=_GUICtrlListView_GetSelectedIndices($idLV) ; Индекс выделенной записи
$Name=_GUICtrlListView_GetItemText($hLV,$IndexListView,0) ; Название
MsgBox(0,'',$Name)
EndSwitch
WEnd
EndFunc
Func WM_NOTIFY( $hWnd, $iMsg, $wParam, $lParam )
Local Static $tText = DllStructCreate( "wchar[50]" )
Local Static $pText = DllStructGetPtr( $tText )
Local $tNMHDR, $hWndFrom, $iCode
$tNMHDR = DllStructCreate( $tagNMHDR, $lParam )
$hWndFrom = HWnd( DllStructGetData( $tNMHDR, "hWndFrom" ) )
$iCode = DllStructGetData( $tNMHDR, "Code" )
Switch $hWndFrom
Case $hLV
Switch $iCode
Case $LVN_GETDISPINFOW
Local $tNMLVDISPINFO = DllStructCreate( $tagNMLVDISPINFO, $lParam )
If BitAND( DllStructGetData( $tNMLVDISPINFO, "Mask" ), $LVIF_TEXT ) Then
Local $sItem = $aItems[DllStructGetData($tNMLVDISPINFO,"Item")]
DllStructSetData( $tText, 1, $sItem )
DllStructSetData( $tNMLVDISPINFO, "Text", $pText )
DllStructSetData( $tNMLVDISPINFO, "TextMax", StringLen( $sItem ) )
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Как изменить функцию WM_NOTIFY для двумерного массива, например для 3-х столбцов
Код:
; Виртуальный ListView
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <Array.au3>
#include <ButtonConstants.au3>
#include <GuiListView.au3>
Global $hGui, $hEdit, $idEditSearch, $hLV, $iItems = 100000, $aItems[$iItems][3]
; Создаем массив
For $i = 0 To $iItems - 1
$aItems[$i][0]='СтрокаI '&$i+1
$aItems[$i][1]='СтрокаII '&$i+1
$aItems[$i][2]='СтрокаIII '&$i+1
Next
; Просмотр элементов массива в Виртуальном ListView
_ArrayVirtualDisplay($aItems)
Func _ArrayVirtualDisplay($aItems)
; Create GUI
$hGui = GUICreate( "Virtual ListView", 300, 230 )
Local $Button1 = GUICtrlCreateButton("Button1", 10, 8, 75, 25)
; Create ListView
Local $idLV = GUICtrlCreateListView( "", 10, 40, 300-20, 200-20, BitOR($LVS_OWNERDATA,$LVS_SHOWSELALWAYS) )
_GUICtrlListView_SetExtendedListViewStyle($idLV, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
$hLV = GUICtrlGetHandle( $idLV ) ; Virtual listview Reduces flicker
_GUICtrlListView_AddColumn( $hLV, "Items1", 100 )
_GUICtrlListView_AddColumn( $hLV, "Items2", 100 )
_GUICtrlListView_AddColumn( $hLV, "Items3", 100 )
; Handle $WM_NOTIFY messages from ListView
; Necessary to display the rows in a virtual ListView
GUIRegisterMsg( $WM_NOTIFY, "WM_NOTIFY" )
; Display items
GUICtrlSendMsg( $idLV, $LVM_SETITEMCOUNT, $iItems, 0 )
GUISetState(@SW_SHOW)
; Message loop
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$hLV = GUICtrlGetHandle( $idLV )
$IndexListView=_GUICtrlListView_GetSelectedIndices($idLV) ; Индекс выделенной записи
$Name=_GUICtrlListView_GetItemText($hLV,$IndexListView,0) ; Название
MsgBox(0,'',$Name)
EndSwitch
WEnd
EndFunc
Func WM_NOTIFY( $hWnd, $iMsg, $wParam, $lParam )
Local Static $tText = DllStructCreate( "wchar[50]" )
Local Static $pText = DllStructGetPtr( $tText )
Local $tNMHDR, $hWndFrom, $iCode
$tNMHDR = DllStructCreate( $tagNMHDR, $lParam )
$hWndFrom = HWnd( DllStructGetData( $tNMHDR, "hWndFrom" ) )
$iCode = DllStructGetData( $tNMHDR, "Code" )
Switch $hWndFrom
Case $hLV
Switch $iCode
Case $LVN_GETDISPINFOW
Local $tNMLVDISPINFO = DllStructCreate( $tagNMLVDISPINFO, $lParam )
If BitAND( DllStructGetData( $tNMLVDISPINFO, "Mask" ), $LVIF_TEXT ) Then
Local $sItem = $aItems[DllStructGetData($tNMLVDISPINFO,"Item")]
DllStructSetData( $tText, 1, $sItem )
DllStructSetData( $tNMLVDISPINFO, "Text", $pText )
DllStructSetData( $tNMLVDISPINFO, "TextMax", StringLen( $sItem ) )
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc