Events in the ListViewGadget

Gadget ›› ListViewGadget ››
Parent Previous Next

Events in the ListViewGadget

В принципе в некоторых подразделах раздела ListViewGadget уже объясняется как обрабатывать события в этом гаджете, но все же решил, сделать обобщающий раздел по событиям. И так:

1 способ: Для того чтобы узнать по какому пункту ListViewGadget вы щелкнули, нужно обработать сначала событие EventGadget. Таким образом мы узнаем, что событие произошло от гаджета (не от меню, не по форме окна, а именно от гаджета!). Далее нужно узнать номер гаджета от которого произошло событие, ведь мы можем насоздавать 2,3,..10 гаджетов в различных окнах, или даже в одном. Это можно узнать с помощью EventNumber. Ну а далее можно уже узнавать по какому пункту мы именно щелкнули. Это можно узнать функцией GetItemListView. Если у вас ListViewGadget с несколькими столбцами, то можно получить в каком именно столбце находится этот пункт функцией GetSubItemListView. Обратите внимание на возвращаемое значение при щелчке не по пункту, а по столбцу, вы увидите, что вместо пункта возвращается -1

Пример

#Include "window9.bi"
#Ifdef __FB_WIN32__
Var Style=LVS_EX_FULLROWSELECT
#Else
Var Style=0
#EndIf
Var hwnd=OpenWindow("",10,10,500,500)
ListViewGadget(1,10,10,310,300,Style)
AddListViewColumn(1, "1",0,0,100)
AddListViewColumn(1, "2",1,1,100)
AddListViewColumn(1, "3",2,2,100)
For aa As Integer=0 To 15
  AddListViewItem(1,"item ?"+Str(aa),0,aa,0)
  AddListViewItem(1,"item ?"+Str(aa+18),0,aa,1)
  AddListViewItem(1,"item ?"+Str(aa+36),0,aa,2)
Next
Do
  Var event=WaitEvent()
  If Event=EventClose Then End
  If event=EventGadget Then
     If EventNumber=1 Then
        ? "ITEM="; GetItemListView()
        ? "SUBITEM="; GetSubItemListView()
     EndIf
  EndIf
Loop

2 способ: Можно использовать такие события как EventMBDown , EventRBDown , EventLBDown, WM_LBUTTONDBLCLK. Есть разница по отношению к прошлому методу: здесь для получения номера гаджета, от которого происходит событие, надо использовать EventNumberListView вместо EventNumber. Этими событиями нельзя корректно получить номер столбца при клике по нему, подробнее смотрите страницу GetColumnListView

Пример2

#Include "window9.bi"
#Ifdef __FB_WIN32__
Var iStyle=LVS_EX_FULLROWSELECT Or LVS_EX_GRIDLINES
#Else
Var iStyle=0
#EndIf
Var hwnd=OpenWindow("",10,10,380,380)
ListViewGadget(1,10,10,310,300,iStyle)
AddListViewColumn(1, "1",0,0,100)
AddListViewColumn(1, "2",1,1,100)
AddListViewColumn(1, "3",2,2,100)
For aa As Integer=0 To 15
  AddListViewItem(1,"item ?"+Str(aa),0,aa,0)
  AddListViewItem(1,"item ?"+Str(aa+18),0,aa,1)
  AddListViewItem(1,"item ?"+Str(aa+36),0,aa,2)
Next
Do
  Var event=WaitEvent()
  If Event=EventClose Then End
  If event=EventLBDown Then
     If EventNumberListView=1 Then
        ? "ITEM="; GetItemListView()
        ? "SUBITEM="; GetSubItemListView()
     EndIf
  EndIf
Loop

3 способ (только для Windows) использовать SetWindowCallBack и оконную процедуру:

Пример3

#Include "window9.bi"
Function windowproc(hwnd As HWND,msg As UINT,wParam As WPARAM,lParam As LPARAM) As Integer
  If msg= WM_NOTIFY Then
     Dim As LPNMHDR pnm
     pnm =Cast( LPNMHDR,lParam)
     If pnm->code = -108 Then'LVN_COLUMNCLICK
        If pnm->idFrom=1 Then ' событие от нашего гаджета под номером 1
           Dim As LPNMLISTVIEW NMLW
           NMLW = Cast(LPNMLISTVIEW,pnm)
           ? NMLW->iSubItem 'получаем номер столбца при клике по нему
        EndIf
     EndIf
  EndIf
  Return 0
End Function
Var hwnd=OpenWindow("",10,10,400,400)
Var Style=LVS_EX_FULLROWSELECT Or LVS_EX_GRIDLINES Or LVS_EX_SUBITEMIMAGES
ListViewGadget(1,10,10,310,300,Style,,,32)
AddListViewColumn(1, "1",0,1,100)
AddListViewColumn(1, "2",1,2,100)
AddListViewColumn(1, "3",2,3,100)
For aa As Integer=0 To 15
  AddListViewItem(1,"item №"+Str(aa),Extract_Icon(GetSystemDir & "\SetupAPI.dll",aa),aa,0)
  AddListViewItem(1,"item №"+Str(aa+18),Extract_Icon(GetSystemDir & "\SetupAPI.dll",aa+16),aa,1)
  AddListViewItem(1,"item №"+Str(aa+36),Extract_Icon(GetSystemDir & "\SetupAPI.dll",aa+32),aa,2)
Next
SetWindowCallback(CInt(@windowproc))
Do
  Var event=WaitEvent()
  If Event=EventClose Then End
Loop

Created with the Personal Edition of HelpNDoc: Free Kindle producer