Что нового

Как создать виртуальный ListView для двумерного массива

pvnn

Осваивающий
Сообщения
282
Репутация
31
Всем доброго времени суток!
Помогите создать виртуальный 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
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,714
При обработке сообщения LVN_GETDISPINFOW проверяйте поле "SubItem" структуры NMLVDISPINFO. Оно будет содержать номер столбца, для которого ведется опрос (0 - первый, 1 - второй и т.д.).
 
Автор
P

pvnn

Осваивающий
Сообщения
282
Репутация
31
Yashied спасибо за совет, сделал так - работает

Код:
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 )
		  $ColumnNumb=DllStructGetData( $tNMLVDISPINFO, "SubItem" ) ; Номер столбца, для которого ведется опрос

          If BitAND( DllStructGetData( $tNMLVDISPINFO, "Mask" ), $LVIF_TEXT ) Then
             Local $sItem = $aItems[DllStructGetData($tNMLVDISPINFO,"Item")][$ColumnNumb]
            DllStructSetData( $tText, 1, $sItem )
            DllStructSetData( $tNMLVDISPINFO, "Text", $pText )
            DllStructSetData( $tNMLVDISPINFO, "TextMax", StringLen( $sItem ) )
		  EndIf

      EndSwitch
  EndSwitch

  Return $GUI_RUNDEFMSG
EndFunc
 
Верх