Что нового

[Элементы GUI] Отследить выделение строки в ListView

by_gangster

Новичок
Сообщения
22
Репутация
0
Создал я допустим 3 строки
Код:
$listview = GUICtrlCreateListView("Название|Скачать",0, 27, 420, 160)
GUICtrlCreateListViewItem("1|url 1",$listview)
GUICtrlCreateListViewItem("2|url 2",$listview)
GUICtrlCreateListViewItem("3|url 3",$listview)


Как отследить клик по строке или выделение строки ? Т.е нужно что-то выполнить когда пользователь выделяет строку или кликает по ней.

А если так
Код:
GUICtrlCreateListViewItem("3|http://autoit-script.ru/",$listview)

Можно сделать гиперссылку во второй столбце ?
 
A

Alofa

Гость
Так:
Код:
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>

Local $hGUI, $iListView, $iLabel, $iItem1, $iItem2, $iItem3, $fListViewEvent = False
Local $sURL = 'http://autoit-script.ru/index.php?topic=22855.0'
$hGUI = GUICreate('ListView', 420, 260)
$iListView = GUICtrlCreateListView('Название|Скачать', 0, 27, 420, 160)
$iItem1 = GUICtrlCreateListViewItem('1|url 1', $iListView)
$iItem2 = GUICtrlCreateListViewItem('2|url 2', $iListView)
$iItem3 = GUICtrlCreateListViewItem('3|url 3', $iListView)
$iLabel = GUICtrlCreateLabel('', 20, 200, 380, 50, $SS_SUNKEN)
GUICtrlSetBkColor(-1, 0xFFFED8)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, '_WM_NOTIFY') ; Регистрация пользовательской функции для перехвата кодов (ID) сообщений Windows для элемента ListView.

Do
	If $fListViewEvent Then
		$iListViewID = GUICtrlRead($iListView)
		$sListViewItemText = GUICtrlRead($iListViewID)
		GUICtrlSetData($iLabel, 'Вы нажали элемент ListViewItem:' & @LF & _
		'				- Идентификатор: ' & $iListViewID & @LF & _
		'				- Текст пункта: ' & $sListViewItemText)
		If $iListViewID = $iItem2 Then
			MsgBox(4096+64, '', $sListViewItemText, 0.5, $hGUI)
			If $fListViewEvent = 2 Then ShellExecute($sURL)
		EndIf
		$fListViewEvent = False
	EndIf
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) ; события в $iListView
	Local $hWndFrom, $iCode, $Key
	$hWndFrom = BitAND($wParam, 0x0000FFFF)
	$iCode = DllStructCreate($tagNMHDR, $lParam).Code
	If $hWndFrom = $iListView Then
		Switch $iCode
			Case $LVN_KEYDOWN ; Клавиатура
				$Key = DllStructCreate($tagNMLVKEYDOWN, $lParam).VKey
				If $Key = 40 Or $Key = 38 Then ContinueCase ; 40 = клавиша - стрелка вниз и 38 = клавиша - стрелка вверх
			Case $NM_DBLCLK, $NM_CLICK, $NM_RCLICK ; Левая и правая клавиши мыши
					; Мы перехватили код события для обработчика Windows, соответственно новый пункт в $iListView еще не переключился.
					; Поэтому мы сигнализируем о событии через $fListViewEvent и даем сработать обработчику.
				$fListViewEvent = True ; ... проверка состояния этой переменной происходит в основном цикле GUI
				If $iCode = $NM_DBLCLK Then $fListViewEvent = 2 ; Если произошел двойной клик левой кнопки мыши
		EndSwitch
	EndIf
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_NOTIFY
 
Автор
B

by_gangster

Новичок
Сообщения
22
Репутация
0
Спасибо. А еще Извиняюсь за туповатый вопрос, но можно функцию WM_NOTIFY, как то уменьшить или оптимизировать ? Может можно как-то проще сделать ?

Код:
#include <GuiRichEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $hRichEdit

Main()

Func Main()

    Local $hGui
    $hGui = GUICreate(StringTrimRight(@ScriptName, 4), 420, 350, -1, -1)
    $hRichEdit = _GUICtrlRichEdit_Create($hGui, '', 10, 10, 400, 220, _
            BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
    GUISetState()

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    _GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_LINK)

    _GUICtrlRichEdit_AutoDetectURL($hRichEdit, true)
    ;_GUICtrlRichEdit_AppendText($hRichEdit, @CR & "http://www.autoitscript.com")
	_GUICtrlRichEdit_SetText ( $hRichEdit, "http://www.autoitscript.com")
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
EndFunc   ;==>Main

Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
    #forceref $hWnd, $iMsg, $iWparam
    Local $hWndFrom, $iCode, $tNMHDR, $tEnLink, $cpMin, $cpMax, $tMsgFilter
    $tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hRichEdit
            Select
                Case $iCode = $EN_LINK
                    $tMsgFilter = DllStructCreate($tagMSGFILTER, $iLparam)
                    If DllStructGetData($tMsgFilter, "msg") = $WM_LBUTTONUP Then
                        $tEnLink = DllStructCreate($tagENLINK, $iLparam)
                        $cpMin = DllStructGetData($tEnLink, "cpMin")
                        $cpMax = DllStructGetData($tEnLink, "cpMax")
                        MsgBox(4096, "", "Здесь вызов вашего веб-браузера открывающего ссылку " & _
                                _GUICtrlRichEdit_GetTextInRange($hRichEdit, $cpMin, $cpMax))
                    EndIf
            EndSelect
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
 
A

Alofa

Гость
OffTopic:
by_gangster сказал(а):
... можно функцию WM_NOTIFY, как то уменьшить или оптимизировать ? Может можно как-то проще сделать ?
Это выходит за рамки обсуждения данной темы. Создайте новую.
 
Верх