В принципе в некоторых подразделах раздела 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
#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 и оконную процедуру:
#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