Что нового

Как сделать два кликабельных элемента ListView?

vovsla

Осваивающий
Сообщения
607
Репутация
36
На одном элементе ListView сделал реакцию на клик, даблклик и клик по заголовку следующим способом

Код:
_GUICtrlListView_RegisterSortCallBack($ListView1)

GUIRegisterMsg($WM_NOTIFY, "ListView1Click")

While 1
	If $iOne_Click_Event Then
        $iOne_Click_Event = 0
        ListView1ItemClick()
    EndIf
   
    If $iDouble_Click_Event Then
        $iDouble_Click_Event = 0
        ListView1ItemDoubleClick()
    EndIf
	
	If $Click_On_Column_Head_Event<>-1 Then
		$Click_On_Column_Head_Event=-1
		ListView1HeadClick()
	EndIf
WEnd


Func ListView1Click($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hListView=$ListView1
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
	
    Switch $hWndFrom
	    Case $hWndListView
            Switch $iCode
                Case $NM_CLICK
                    $iOne_Click_Event = True
                Case $NM_DBLCLK
                    $iDouble_Click_Event = True
				Case $LVN_COLUMNCLICK
					Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
					$Click_On_Column_Head_Event=DllStructGetData($tInfo, "SubItem")
            EndSwitch
    EndSwitch
   
    Return $GUI_RUNDEFMSG
EndFunc


но у меня не получилось сделать сразу 2 элемента ListView кликабельными
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Можно так :
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>

$Gui = GUICreate("Test", 400, 250)

$hListView = _GUICtrlListView_Create($GUI, "Items|SubItems", 2, 2, 150, 200, BitOR($LVS_EDITLABELS, $LVS_REPORT))

$ListItem1 = _GUICtrlListView_AddItem($hListView, "Boris",0)
$ListItem2 = _GUICtrlListView_AddItem($hListView, "Anna",2)
$ListItem3 = _GUICtrlListView_AddItem($hListView, "Sveta",1)
$ListItem4 = _GUICtrlListView_AddItem($hListView, "Misha",3)
$ListSubItem1 = _GUICtrlListView_AddSubItem ($hListView, 0,'44', 1)
$ListSubItem2 = _GUICtrlListView_AddSubItem ($hListView, 1,'22', 1)
$ListSubItem3 = _GUICtrlListView_AddSubItem ($hListView, 2,'11', 1)
$ListSubItem4 = _GUICtrlListView_AddSubItem ($hListView, 3,'33', 1)

$hListView2 = _GUICtrlListView_Create($GUI, "Items|SubItems", 160, 2, 150, 200, BitOR($LVS_EDITLABELS, $LVS_REPORT))
$ListItem1 = _GUICtrlListView_AddItem($hListView2, "Борис",0)
$ListItem2 = _GUICtrlListView_AddItem($hListView2, "Анна",2)
$ListItem3 = _GUICtrlListView_AddItem($hListView2, "Света",1)
$ListItem4 = _GUICtrlListView_AddItem($hListView2, "Миша",3)
$ListSubItem1 = _GUICtrlListView_AddSubItem ($hListView2, 0,'44', 1)
$ListSubItem2 = _GUICtrlListView_AddSubItem ($hListView2, 1,'22', 1)
$ListSubItem3 = _GUICtrlListView_AddSubItem ($hListView2, 2,'11', 1)
$ListSubItem4 = _GUICtrlListView_AddSubItem ($hListView2, 3,'33', 1)

$Label=GUICtrlCreateLabel('',5, 220, 100, 25,0x1000)

GUISetState()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Global $B_DESCENDING[_GUICtrlListView_GetColumnCount ($hListView) ]
_GUICtrlListView_RegisterSortCallBack($hListView)

While 1
	$msg = GUIGetMsg()
	Switch $msg
	Case $GUI_EVENT_CLOSE
		ExitLoop
	
	EndSwitch
WEnd
	
;==============================================
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
;==================================================================	
	#forceref $hWnd, $iMsg, $iwParam
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
	
	$hWndListView = $hListView
	If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
	$hWndListView2 = $hListView2
	If Not IsHWnd($hListView2) Then $hWndListView2 = GUICtrlGetHandle($hListView2)
	
	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $hWndFrom
		Case $hWndListView, $hWndListView2
			Switch $iCode
				Case $NM_CLICK
					Global $aHit = _GUICtrlListView_SubItemHitTest($hWndFrom)
					GUICtrlSetData($Label,_GUICtrlListView_GetItemText($hWndFrom, $aHit [0],$aHit [1]))
 
				Case $LVN_COLUMNCLICK
					Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
					Global $ColumnIndex = DllStructGetData($tInfo, "SubItem")
					_GUICtrlListView_SimpleSort($hWndFrom, $B_DESCENDING,$ColumnIndex)				
			EndSwitch
	EndSwitch 
	Return $GUI_RUNDEFMSG
EndFunc ; ===> WM_NOTIFY
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Переносить обработку в основной цикл это холостой ход. Можно выполнить прямо в WM_NOTIFY.

при обработке прямо в WM_NOTIFY виснет функция _ArrayDisplay

gregaz, спасибо за пример, но в нем не показывается направление сортировки при клике на колонку. Это реализуемо?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Vovsla [?]
gregaz, спасибо за пример, но в нем не показывается направление сортировки при клике на колонку. Это реализуемо?

Я здесь показал принцип организации кликов для 2-х LV.
но в нем не показывается направление сортировки при клике на колонку. Это реализуемо?

Смотри пример справки для ф-ии : _GUICtrlListView_SortItems .
Там ведь все показано и для 2-х LV.

Только не забывать про 4-й параметр :
Код:
$iIndex = _GUICtrlListView_AddItem($hListView, $sText, 0, _GUICtrlListView_GetItemCount($hListView) + 9999
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
если в WM_NOTIFY прописать return ListView1ItemClick(), а в ListView1ItemClick() будет _ArrayDisplay, то все повистнет
 
Верх