Что нового

[Элементы GUI] Выделение и редактирование ячеек ListView

kokseek

Новичок
Сообщения
8
Репутация
2
Здравствуйте любители AUTOITа. Нужна Ваша помощь. Советы, уточнения, примеры, в общем все что может помочь написать приблизительно такой пример.
Есть многомерный массив.
Хотелось вывести его в ListView и (подобно Excel-я) в нем выделять ячейки, с возможностью редактирования текста, подстановкой данных с ComboBox-а.
Вот написал что-то примерное. Сразу же объясню: при изменении размера колонок, элемент EDIT не корректно отображается и устанавливает соответственную ширину (особенно после редактирования). Отредактированные данные еще не переписываются в ListView.

В общем буду очень рад и благодарен тем кто поможет в этом вопросе.

P.S. Я только учусь. За не правильное мышление не судите :smile:


Код:
#include <GuiConstantsEx.au3>
#include <WinAPI.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <GuiEdit.au3>

#include <GuiComboBox.au3>
#include <array.au3>


Global $hImage, $hEdit, $iLastItemIndex = 0, $iLastSubItemIndex = 0, $ColumnWidth = 100, $aArrColumnWidth[1]

Global $GUI = GUICreate("(UDF Created) ListView Create", 400, 300)
Global $hListView = _GUICtrlListView_Create($GUI, "", 2, 2, 394, 268)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_SUBITEMIMAGES, $LVS_EX_FULLROWSELECT))

; Load images
$hImage = _GUIImageList_Create()
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
_GUICtrlListView_SetImageList($hListView, $hImage, 1)

; Add columns
_GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
_GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 150)
_GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)

_GUICtrlListView_JustifyColumn($hListView, 1, 2)

; Add items
_GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2)
_GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
_GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
_GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)

_GUICtrlListView_SetColumnWidth($hListView, 2, -1)

ReDim $aArrColumnWidth[_GUICtrlListView_GetColumnCount($hListView)]
For $i = 0 To _GUICtrlListView_GetColumnCount($hListView) - 1
	$aArrColumnWidth[$i] = _GUICtrlListView_GetColumnWidth($hListView, $i)
Next

GUISetState()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
	EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iCode, $tNMHDR, $iIDFrom
	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $hWndFrom
		Case $hListView
			Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
			Local $iIndex = DllStructGetData($tInfo, "Index")
			Local $iSubItem = DllStructGetData($tInfo, "SubItem")
			Local $sTextItem = _GUICtrlListView_GetItemText($hListView, $iIndex, $iSubItem)
			Switch $iCode
				Case $NM_CLICK, $NM_DBLCLK ;
					If $iIndex >= 0 And $iSubItem >= 0 Then
						$iLastItemIndex = $iIndex
						$iLastSubItemIndex = $iSubItem
						_GUICtrlEdit_Destroy($hEdit)
						_GUICtrlListView_SetItemSelected($hListView, $iIndex, False, True)
						_GUICtrlListView_SetItemFocused($hListView, $iIndex, False)
						_GUICtrlListView_BeginUpdate($hListView)
						Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $iIndex, $iSubItem)
						$hEdit = _GUICtrlEdit_Create($hListView, $sTextItem, $aRect[0], $aRect[1], _GUICtrlListView_GetColumnWidth($hListView, $iSubItem), $aRect[3] - $aRect[1], $ES_LEFT)
						_GUICtrlListView_EndUpdate($hListView)
						_GUICtrlListView_RedrawItems($hListView, $iIndex, $iIndex)
					EndIf
				Case -12
					If $iSubItem >= 0 Then
						For $i = 0 To _GUICtrlListView_GetColumnCount($hListView) - 1
							If $aArrColumnWidth[$i] <> _GUICtrlListView_GetColumnWidth($hListView, $i) Then
								$aArrColumnWidth[$i] = _GUICtrlListView_GetColumnWidth($hListView, $i)
								_GUICtrlListView_BeginUpdate($hListView)
								$sTmp_Text = _GUICtrlEdit_GetText($hEdit)
								_GUICtrlEdit_Destroy($hEdit)
								$aRect = _GUICtrlListView_GetSubItemRect($hListView, $iLastItemIndex, $iLastSubItemIndex)
								$hEdit = _GUICtrlEdit_Create($hListView, $sTmp_Text, $aRect[0], $aRect[1], _GUICtrlListView_GetColumnWidth($hListView, $iLastItemIndex), $aRect[3] - $aRect[1], $ES_LEFT)
								_GUICtrlListView_EndUpdate($hListView)
								_GUICtrlListView_RedrawItems($hListView, $iLastItemIndex, $iLastItemIndex)

							EndIf
						Next
					EndIf
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Автор
K

kokseek

Новичок
Сообщения
8
Репутация
2
Вот, исходя из примеров, получилось следующее:
В заполненном ListView есть возможность перемещаться по ячейкам с помощью клавиш UP/DOWN/LEFT/RIGHT и кликом мышки. Ячейка определяется выделенной строкой и выделенной колонкой (на сером фоне лучше видно чем на светлом). С помощью клавиш F2 или пробел, а так же двойном клике мышки можно редактировать ячейку (при этом таблица блокируется, не смог найти решение проблемы в режиме редактирования когда изменяешь ширину столбца или прокрутка скролом. Может у кого будут какие идеи). Отмена редактирования клавиша Esc, запомнить и завершить редактирование клавиша Enter.

Может у кого то есть какие-нибудь мысли по улучшению данного варианта, буду благодарен.

Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <Math.au3> ; _min _max

;Opt("GUICloseOnESC", 1)
Opt("GUIOnEventMode", 1)
Global $aElement[2], $hActive, $iInput
Global $iListView, $hListView, $dummy1, $dummy2
Global $iLastItemIndex = 0, $iLastSubItemIndex = 0

$hGUI = GUICreate('Двойной клик на элементе', 800, 600)
GUICtrlSetFont(-1, 10, 450)
GUISetOnEvent(-3, '_Exit')
$iInput = GUICtrlCreateInput("", 0, 0, 0, 0)
GUICtrlSetBkColor($iInput, 0xFFFF88) ;0x00FF00
GUICtrlSetFont(-1, 10, 450)
GUICtrlSetState(-1, $GUI_HIDE)
$iListView = GUICtrlCreateListView('колонка 1|колонка 2|колонка 3', 5, 5, 740, 530)
GUICtrlSetFont(-1, 10, 450)
GUICtrlSetBkColor(-1, 0xc0c0c0)
$hListView = GUICtrlGetHandle($iListView)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_REPORT, $LVS_SHOWSELALWAYS), $LVS_EX_GRIDLINES)



;ZAPOLNYAEM
;~ $aMasiv = IniReadSection("DR.ini", "DR")
;~ _GUICtrlListView_AddArray($hListView, $aMasiv)


For $i = 1 To 20
	$item1 = Random(10, 99, 1)
	$item2 = ''
	For $j = 1 To 90
		$item2 &= Chr(Random(65, 90, 1)) ; 192, 255 - Ru
	Next
	$item3 = Random(10, 99, 1)
	GUICtrlCreateListViewItem($item1 & '|' & $item2 & '|' & $item3, $iListView) ; создаём пункты
Next


$aPos = ControlGetPos($hGUI, "", $hListView)
$iSrW = $aPos[2] / 3
For $i = 0 To 3;ubound($aMasiv, 2)
	_GUICtrlListView_SetColumnWidth($hListView, $i, -2)
	If _GUICtrlListView_GetColumnWidth($hListView, $i) > $iSrW Then _GUICtrlListView_SetColumnWidth($hListView, $i, $iSrW)
Next




$dummy1 = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_CE")
$dummy2 = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_SaveChange")
Global $AccelKeys[2][2] = [["{ESC}", $dummy1],["{ENTER}", $dummy2]]
GUISetAccelerators($AccelKeys)

GUISetState()
GUIRegisterMsg(0x4E, "_WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ; для скрытия поля ввода при потере фокуса.

_GUICtrlListView_SetItemSelected($hListView, 0, True, True)
_GUICtrlListView_SetSelectedColumn($hListView, 0)



While 1
	Sleep(100)
WEnd



; Выводит элемент Input на передний план
Func _GUICtrlListView_EditItem($hWnd, $iIndex, $iSubItem)
	;funkey 19.02.2010
	GUICtrlSetState($iInput, $GUI_HIDE)
	If $iIndex < 0 Then Return
	Local $aPos, $aRect, $iSum = 0
	Local $x, $y, $w, $h

	$aPos = ControlGetPos($hGUI, "", $hWnd)
	$aRect = _GUICtrlListView_GetSubItemRect($hListView, $iIndex, $iSubItem, 0)
	$x = $aPos[0] + _Max(0, $aRect[0]) + 4
	$y = $aRect[1] + 4
	;w
	If $aRect[0] >= 0 Then
		If $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem) <= $aPos[2] - 25 Then
			$w = _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
		Else
			$w = ($aPos[2] - 25) - $aRect[0]
		EndIf
	Else
		If $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem) <= $aPos[2] - 25 Then
			$w = $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
		Else
			$w = ($aPos[2] - 25)
		EndIf
	EndIf
	;==> w
	$h = $aRect[3] - $aRect[1]
	GUICtrlSetPos($iInput, $x - 1, $y, $w, $h + 5)
	GUICtrlSetData($iInput, _GUICtrlListView_GetItemText($hWnd, $iIndex, $iSubItem))
	GUICtrlSetState($iInput, $GUI_SHOW)
	ControlDisable($hGUI, "", $hListView)
	ControlFocus($hGUI, "", $iInput)
	Send("+{HOME}")
	$aElement[0] = $iIndex
	$aElement[1] = $iSubItem
EndFunc   ;==>_GUICtrlListView_EditItem

; Сохранить изменения редактирования пункта
Func _SaveChange()
	Local $sText = GUICtrlRead($iInput)
	If StringInStr($sText, @CR) Or StringInStr($sText, @LF) Then
		If StringLeft($sText, 1) <> '"' And StringInStr(StringMid($sText, 2, StringLen($sText) - 2), '"') Then $sText = StringReplace($sText, '"', "'")
		$sText = '"' & StringReplace($sText, '"', '') & '"'
	EndIf
	_GUICtrlListView_BeginUpdate($hActive)
	_GUICtrlListView_SetItemText($hActive, $aElement[0], $sText, $aElement[1])
	GUICtrlSetState($iInput, $GUI_HIDE)
	;_GUICtrlListView_SetColumnWidth($hListView, $aElement[1], -2) ;$LVSCW_AUTOSIZE_USEHEADER
	_GUICtrlListView_EndUpdate($hActive)
	ControlEnable($hGUI, "", $hListView)
	ControlFocus($hGUI, "", $hListView)
	Return $sText ; возвращаем текст, если требуется его использовать после применения
EndFunc   ;==>_SaveChange

Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $hWndFrom
		Case $hListView
			Switch $iCode
				Case $NM_CLICK
					Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
					Local $iIndex = DllStructGetData($tInfo, "Index")
					Local $iSubItem = DllStructGetData($tInfo, "SubItem")
					Local $sTextItem = _GUICtrlListView_GetItemText($hListView, $iIndex, $iSubItem)
					$iLastItemIndex = $iIndex
					$iLastSubItemIndex = $iSubItem
					_GUICtrlListView_SetSelectedColumn($hListView, $iLastSubItemIndex)
					$hActive = $hListView
					GUICtrlSetState($iInput, $GUI_HIDE)
					ControlFocus($hGUI, "", $hListView)
				Case $NM_DBLCLK ; двойной клик - редактируем пункт ListView
					Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
					_GUICtrlListView_EditItem($hListView, DllStructGetData($tInfo, "Index"), DllStructGetData($tInfo, "SubItem"))
					$hActive = $hListView
				Case $NM_rCLICK
					Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
					Local $iIndex = DllStructGetData($tInfo, "Index")
					Local $iSubItem = DllStructGetData($tInfo, "SubItem")
					Local $sTextItem = _GUICtrlListView_GetItemText($hListView, $iIndex, $iSubItem)
					$iLastItemIndex = $iIndex
					$iLastSubItemIndex = $iSubItem
					ConsoleWrite(_GUICtrlListView_GetSelectedIndices($hListView) & @CRLF)
				Case $LVN_KEYDOWN ; нажатие любой клавиши
					;Local $tInfo = DllStructCreate($tagNMLVKEYDOWN, $ilParam)
					;Local $Key = DllStructGetData($tInfo, "VKey")
					;ConsoleWrite("key pres " & $Key & @CRLF)
					Switch DllStructGetData(DllStructCreate($tagNMLVKEYDOWN, $ilParam), "VKey") ;DllStructGetData($tInfo, "VKey")
						Case 113, 32; f2, probel
							If $iLastItemIndex <> -1 And $iLastSubItemIndex <> -1 Then
								ConsoleWrite("RED " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
								_GUICtrlListView_EditItem($hListView, _GUICtrlListView_GetSelectedIndices($hListView), $iLastSubItemIndex)
								$hActive = $hListView
							EndIf
						Case 38; up
							If $iLastItemIndex - 1 >= 0 Then
								$iLastItemIndex = $iLastItemIndex - 1
								$aRect = _GUICtrlListView_GetSubItemRect($hListView, $iLastItemIndex, $iLastSubItemIndex)
								;_GUICtrlListView_Scroll($hListView, 0, -1 * ($aRect[3] - $aRect[1]))
								ConsoleWrite("step " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
							EndIf
						Case 40; down
							If _GUICtrlListView_GetItemCount($hListView) - 1 >= $iLastItemIndex + 1 Then

								$iLastItemIndex = $iLastItemIndex + 1
								$aRect = _GUICtrlListView_GetSubItemRect($hListView, $iLastItemIndex, $iLastSubItemIndex)
								;_GUICtrlListView_Scroll($hListView, 0, 1 * ($aRect[3] - $aRect[1]))
								ConsoleWrite("step " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
							EndIf
						Case 37; left
							If $iLastSubItemIndex - 1 >= 0 Then
								$iLastSubItemIndex = $iLastSubItemIndex - 1
								_GUICtrlListView_Scroll($hListView, -1 * (_GUICtrlListView_GetColumnWidth($hListView, $iLastSubItemIndex + 1)), 0)
								_GUICtrlListView_SetSelectedColumn($hListView, $iLastSubItemIndex)
								ConsoleWrite("step " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
							EndIf
						Case 39; right
							If _GUICtrlListView_GetColumnCount($hListView) - 1 >= $iLastSubItemIndex + 1 Then
								$iLastSubItemIndex = $iLastSubItemIndex + 1
								_GUICtrlListView_Scroll($hListView, 1 * (_GUICtrlListView_GetColumnWidth($hListView, $iLastSubItemIndex - 1)), 0)
								_GUICtrlListView_SetSelectedColumn($hListView, $iLastSubItemIndex)
								ConsoleWrite("step " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
							EndIf
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_NOTIFY

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
	#forceref $hWnd, $iMsg
	Local $iIDFrom, $iCode
	$iIDFrom = BitAND($iwParam, 0xFFFF) ; младшее слово
	$iCode = BitShift($iwParam, 16) ; старшее слово
	Switch $iIDFrom
		Case $iInput
			Switch $iCode
				Case $EN_KILLFOCUS
;~ 					GUICtrlSetState($iInput, $GUI_HIDE)
;~ 					ControlEnable($hGUI, "", $hListView)
;~ 					ControlFocus($hGUI, "", $hListView)
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND


Func _CE()
	GUICtrlSetState($iInput, $GUI_HIDE)
	ControlEnable($hGUI, "", $hListView)
	ControlFocus($hGUI, "", $hListView)
EndFunc   ;==>_CE


Func _Exit()
	Exit
EndFunc   ;==>_Exit
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
kokseek
не смог найти решение проблемы в режиме редактирования когда изменяешь ширину столбца или прокрутка скролом
Я тоже не так давно искал событие, которое бы возникало при изменении ширины столбцов. Можно было бы новую ширину применить к редактируемому полю. На счёт прокручивания примерно также, при событии прокручивания получить позицию пункта и перемещать поле ввода. Проверять видимость пункта, чтобы скрыть/показать поле ввода.
 

XpycT

Скриптер
Сообщения
380
Репутация
133
AZJIO [?]
событие, которое бы возникало при изменении ширины столбцов
Это событие отправляет в ListView Header

Вот что у меня получилось
Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <Math.au3> ; _min _max

;Opt("GUICloseOnESC", 1)
Opt("GUIOnEventMode", 1)
Global $aElement[2], $hActive, $iInput
Global $iListView, $hListView, $dummy1, $dummy2
Global $iLastItemIndex = 0, $iLastSubItemIndex = 0

$hGUI = GUICreate('Двойной клик на элементе', 800, 600)
GUICtrlSetFont(-1, 10, 450)
GUISetOnEvent(-3, '_Exit')
$iInput = GUICtrlCreateInput("", 0, 0, 0, 0)
GUICtrlSetBkColor($iInput, 0xFFFF88) ;0x00FF00
GUICtrlSetFont(-1, 10, 450)
GUICtrlSetState(-1, $GUI_HIDE)
$iListView = GUICtrlCreateListView('колонка 1|колонка 2|колонка 3', 5, 5, 740, 530)
GUICtrlSetFont(-1, 10, 450)
GUICtrlSetBkColor(-1, 0xc0c0c0)
$hListView = GUICtrlGetHandle($iListView)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_REPORT, $LVS_SHOWSELALWAYS), $LVS_EX_GRIDLINES)

$hListViewHeader = _GUICtrlListView_GetHeader($hListView)



;ZAPOLNYAEM
;~ $aMasiv = IniReadSection("DR.ini", "DR")
;~ _GUICtrlListView_AddArray($hListView, $aMasiv)


For $i = 1 To 20
    $item1 = Random(10, 99, 1)
    $item2 = ''
    For $j = 1 To 90
        $item2 &= Chr(Random(65, 90, 1)) ; 192, 255 - Ru
    Next
    $item3 = Random(10, 99, 1)
    GUICtrlCreateListViewItem($item1 & '|' & $item2 & '|' & $item3, $iListView) ; создаём пункты
Next


$aPos = ControlGetPos($hGUI, "", $hListView)
$iSrW = $aPos[2] / 3
For $i = 0 To 3;ubound($aMasiv, 2)
    _GUICtrlListView_SetColumnWidth($hListView, $i, -2)
    If _GUICtrlListView_GetColumnWidth($hListView, $i) > $iSrW Then _GUICtrlListView_SetColumnWidth($hListView, $i, $iSrW)
Next




$dummy1 = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_CE")
$dummy2 = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_SaveChange")
$dummy3 = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Resize")
Global $AccelKeys[2][2] = [["{ESC}", $dummy1],["{ENTER}", $dummy2]]
GUISetAccelerators($AccelKeys)

GUISetState()
GUIRegisterMsg(0x4E, "_WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ; для скрытия поля ввода при потере фокуса.

_GUICtrlListView_SetItemSelected($hListView, 0, True, True)
_GUICtrlListView_SetSelectedColumn($hListView, 0)



While 1
    Sleep(100)
WEnd



; Выводит элемент Input на передний план
Func _GUICtrlListView_EditItem($hWnd, $iIndex, $iSubItem)
    ;funkey 19.02.2010
    GUICtrlSetState($iInput, $GUI_HIDE)
    If $iIndex < 0 Then Return
    Local $aPos, $aRect, $iSum = 0
    Local $x, $y, $w, $h

    $aPos = ControlGetPos($hGUI, "", $hWnd)
    $aRect = _GUICtrlListView_GetSubItemRect($hListView, $iIndex, $iSubItem, 0)

    $x = $aPos[0] + _Max(0, $aRect[0]) + 4
    $y = $aRect[1] + 4
    ;w
    If $aRect[0] >= 0 Then
        If $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem) <= $aPos[2] - 25 Then
            $w = _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
        Else
            $w = ($aPos[2] - 25) - $aRect[0]
        EndIf
    Else
        If $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem) <= $aPos[2] - 25 Then
            $w = $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
        Else
            $w = ($aPos[2] - 25)
        EndIf
    EndIf
    ;==> w
    $h = $aRect[3] - $aRect[1]
    GUICtrlSetPos($iInput, $x - 1, $y, $w, $h + 5)
    GUICtrlSetData($iInput, _GUICtrlListView_GetItemText($hWnd, $iIndex, $iSubItem))
    GUICtrlSetState($iInput, $GUI_SHOW)
;     ControlDisable($hGUI, "", $hListView)
    ControlFocus($hGUI, "", $iInput)
    Send("+{HOME}")
    $aElement[0] = $iIndex
    $aElement[1] = $iSubItem
EndFunc   ;==>_GUICtrlListView_EditItem

; Сохранить изменения редактирования пункта
Func _SaveChange()
    Local $sText = GUICtrlRead($iInput)
    If StringInStr($sText, @CR) Or StringInStr($sText, @LF) Then
        If StringLeft($sText, 1) <> '"' And StringInStr(StringMid($sText, 2, StringLen($sText) - 2), '"') Then $sText = StringReplace($sText, '"', "'")
        $sText = '"' & StringReplace($sText, '"', '') & '"'
    EndIf
    _GUICtrlListView_BeginUpdate($hActive)
    _GUICtrlListView_SetItemText($hActive, $aElement[0], $sText, $aElement[1])
    GUICtrlSetState($iInput, $GUI_HIDE)
    ;_GUICtrlListView_SetColumnWidth($hListView, $aElement[1], -2) ;$LVSCW_AUTOSIZE_USEHEADER
    _GUICtrlListView_EndUpdate($hActive)
    ControlEnable($hGUI, "", $hListView)
    ControlFocus($hGUI, "", $hListView)
    Return $sText ; возвращаем текст, если требуется его использовать после применения
EndFunc   ;==>_SaveChange

; Изменяем размер после того как изменилась ширина столбца
Func _Resize()
    $hWnd = $hListView

    $iIndex = $aElement[0]
    $iSubItem = $aElement[1]
    ConsoleWrite("_GUICtrlListView_EditItem_Resize > $iIndex = " & $iIndex & " | $iSubItem = " & $iSubItem & @CR)

    $aPos = ControlGetPos($hGUI, "", $hWnd)

    $aRect = _GUICtrlListView_GetSubItemRect($hWnd, $iIndex, $iSubItem, 0)
;     ConsoleWrite("_GUICtrlListView_EditItem_Resize > $aRect = " & StringFormat("%03d,%03d,%03d,%03d", $aRect[0], $aRect[1], $aRect[2], $aRect[3]) & @CR)

    Local $w

    ;w
    If $aRect[0] >= 0 Then
        If $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem) <= $aPos[2] - 25 Then
            $w = _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
        Else
            $w = ($aPos[2] - 25) - $aRect[0]
        EndIf
    Else
        If $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem) <= $aPos[2] - 25 Then
            $w = $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
        Else
            $w = ($aPos[2] - 25)
        EndIf
    EndIf
    ;==> w

    $aInputPos = ControlGetPos($hGUI, "", $iInput)
;     ConsoleWrite("_GUICtrlListView_EditItem_Resize > $aInputPos 1 = " & StringFormat("%03d,%03d,%03d,%03d", $aInputPos[0], $aInputPos[1], $aInputPos[2], $aInputPos[3]) & @CR)

    GUICtrlSetPos($iInput, $aInputPos[0], $aInputPos[1], $w, $aInputPos[3])

    $aInputPos = ControlGetPos($hGUI, "", $iInput)
;     ConsoleWrite("_GUICtrlListView_EditItem_Resize > $aInputPos 2 = " & StringFormat("%03d,%03d,%03d,%03d", $aInputPos[0], $aInputPos[1], $aInputPos[2], $aInputPos[3]) & @CR)

    _GUICtrlListView_SetItemSelected($hWnd, $iIndex, False, False)

    GUICtrlSetState($iInput, $GUI_SHOW)
    ControlFocus($hGUI, "", $iInput)
EndFunc


Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hListView
            Switch $iCode
                Case $NM_CLICK
                    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    Local $iIndex = DllStructGetData($tInfo, "Index")
                    Local $iSubItem = DllStructGetData($tInfo, "SubItem")
                    Local $sTextItem = _GUICtrlListView_GetItemText($hListView, $iIndex, $iSubItem)
                    $iLastItemIndex = $iIndex
                    $iLastSubItemIndex = $iSubItem
                    _GUICtrlListView_SetSelectedColumn($hListView, $iLastSubItemIndex)
                    $hActive = $hListView
                    GUICtrlSetState($iInput, $GUI_HIDE)
                    ControlFocus($hGUI, "", $hListView)
                Case $NM_DBLCLK ; двойной клик - редактируем пункт ListView
                    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    _GUICtrlListView_EditItem($hListView, DllStructGetData($tInfo, "Index"), DllStructGetData($tInfo, "SubItem"))
                    $hActive = $hListView
                Case $NM_rCLICK
                    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    Local $iIndex = DllStructGetData($tInfo, "Index")
                    Local $iSubItem = DllStructGetData($tInfo, "SubItem")
                    Local $sTextItem = _GUICtrlListView_GetItemText($hListView, $iIndex, $iSubItem)
                    $iLastItemIndex = $iIndex
                    $iLastSubItemIndex = $iSubItem
                    ConsoleWrite(_GUICtrlListView_GetSelectedIndices($hListView) & @CRLF)
                Case $LVN_KEYDOWN ; нажатие любой клавиши
                    ;Local $tInfo = DllStructCreate($tagNMLVKEYDOWN, $ilParam)
                    ;Local $Key = DllStructGetData($tInfo, "VKey")
                    ;ConsoleWrite("key pres " & $Key & @CRLF)
                    Switch DllStructGetData(DllStructCreate($tagNMLVKEYDOWN, $ilParam), "VKey") ;DllStructGetData($tInfo, "VKey")
                        Case 113, 32; f2, probel
                            If $iLastItemIndex <> -1 And $iLastSubItemIndex <> -1 Then
                                ConsoleWrite("RED " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
                                _GUICtrlListView_EditItem($hListView, _GUICtrlListView_GetSelectedIndices($hListView), $iLastSubItemIndex)
                                $hActive = $hListView
                            EndIf
                        Case 38; up
                            If $iLastItemIndex - 1 >= 0 Then
                                $iLastItemIndex = $iLastItemIndex - 1
                                $aRect = _GUICtrlListView_GetSubItemRect($hListView, $iLastItemIndex, $iLastSubItemIndex)
                                ;_GUICtrlListView_Scroll($hListView, 0, -1 * ($aRect[3] - $aRect[1]))
                                ConsoleWrite("step " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
                            EndIf
                        Case 40; down
                            If _GUICtrlListView_GetItemCount($hListView) - 1 >= $iLastItemIndex + 1 Then

                                $iLastItemIndex = $iLastItemIndex + 1
                                $aRect = _GUICtrlListView_GetSubItemRect($hListView, $iLastItemIndex, $iLastSubItemIndex)
                                ;_GUICtrlListView_Scroll($hListView, 0, 1 * ($aRect[3] - $aRect[1]))
                                ConsoleWrite("step " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
                            EndIf
                        Case 37; left
                            If $iLastSubItemIndex - 1 >= 0 Then
                                $iLastSubItemIndex = $iLastSubItemIndex - 1
                                _GUICtrlListView_Scroll($hListView, -1 * (_GUICtrlListView_GetColumnWidth($hListView, $iLastSubItemIndex + 1)), 0)
                                _GUICtrlListView_SetSelectedColumn($hListView, $iLastSubItemIndex)
                                ConsoleWrite("step " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
                            EndIf
                        Case 39; right
                            If _GUICtrlListView_GetColumnCount($hListView) - 1 >= $iLastSubItemIndex + 1 Then
                                $iLastSubItemIndex = $iLastSubItemIndex + 1
                                _GUICtrlListView_Scroll($hListView, 1 * (_GUICtrlListView_GetColumnWidth($hListView, $iLastSubItemIndex - 1)), 0)
                                _GUICtrlListView_SetSelectedColumn($hListView, $iLastSubItemIndex)
                                ConsoleWrite("step " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
                            EndIf
                    EndSwitch
            EndSwitch
        Case $hListViewHeader
            Switch $iCode
;                 Case $HDN_BEGINTRACK, $HDN_BEGINTRACKW ; Notifies a header control's parent window that the user has begun dragging a divider in the control
;                     $tNMHEADER = DllStructCreate($tagNMHEADER, $ilParam)
;                     ConsoleWrite("$HDN_BEGINTRACK --> hWndFrom:" & DllStructGetData($tNMHEADER, "hWndFrom") & " | IDFrom:" & DllStructGetData($tNMHEADER, "IDFrom") & @CR)
;                     ConsoleWrite("$HDN_BEGINTRACK --> Code:" & @TAB & DllStructGetData($tNMHEADER, "Code") & " | Item:" & @TAB & DllStructGetData($tNMHEADER, "Item") & @CR)
;                     ConsoleWrite("$HDN_BEGINTRACK --> Button:" & @TAB & DllStructGetData($tNMHEADER, "Button") & @CR)
;                     Return False ; To allow tracking of the divider
                Case $HDN_ENDTRACK, $HDN_ENDTRACKW ; Notifies a header control's parent window that the user has begun dragging a divider in the control
                    $tNMHEADER = DllStructCreate($tagNMHEADER, $ilParam)
;                     ConsoleWrite("$HDN_ENDTRACK > hWndFrom:" & DllStructGetData($tNMHEADER, "hWndFrom") & " | IDFrom:" & DllStructGetData($tNMHEADER, "IDFrom") & @CR)
;                     ConsoleWrite("$HDN_ENDTRACK > Code:" & @TAB & DllStructGetData($tNMHEADER, "Code") & " | Item:" & @TAB & DllStructGetData($tNMHEADER, "Item") & @CR)
;                     ConsoleWrite("$HDN_ENDTRACK > Button:" & @TAB & DllStructGetData($tNMHEADER, "Button") & @CR)
                    GUICtrlSendToDummy($dummy3, 1)
                    Return False ; To allow tracking of the divider
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_NOTIFY

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Local $iIDFrom, $iCode
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; младшее слово
    $iCode = BitShift($iwParam, 16) ; старшее слово
    Switch $iIDFrom
        Case $iInput
            Switch $iCode
                Case $EN_KILLFOCUS
;~                  GUICtrlSetState($iInput, $GUI_HIDE)
;~                  ControlEnable($hGUI, "", $hListView)
;~                  ControlFocus($hGUI, "", $hListView)
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND


Func _CE()
    GUICtrlSetState($iInput, $GUI_HIDE)
    ControlEnable($hGUI, "", $hListView)
    ControlFocus($hGUI, "", $hListView)
EndFunc   ;==>_CE


Func _Exit()
    Exit
EndFunc   ;==>_Exit
 
Автор
K

kokseek

Новичок
Сообщения
8
Репутация
2
Сбасибо XpycT-у за $hListViewHeader, думаю это будет полезным многим :ok:
Немного переделал:
-Со скролом решил побороться путем его отключения во время редактирования.
-Функцию _Resize переписал (были траблы с координатами при каких то случаях, уже не вспомню)
-В сообщении $hListViewHeader ($HDN_ENDTRACK, $HDN_ENDTRACKW) добавил $HDN_DIVIDERDBLCLICKW (реагирование на двойной клик между колонками)

Извиняюсь за не нужные переменные и прочий мусор в скрипте. В конечном результате выложу красивый скрипт :smile:

Жду еще предложений...

Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <Math.au3> ; _min _max

#include <GUIScrollBars.au3>
#include <ScrollBarConstants.au3>


;Opt("GUICloseOnESC", 1)
Opt("GUIOnEventMode", 1)
Global $aElement[2], $hActive, $iInput, $iFlagEdit = 0
Global $iListView, $hListView, $dummy1, $dummy2
Global $iLastItemIndex = 0, $iLastSubItemIndex = 0

$hGUI = GUICreate('Двойной клик на элементе', 800, 600)
GUICtrlSetFont(-1, 10, 450)
GUISetOnEvent(-3, '_Exit')
$iInput = GUICtrlCreateInput("", 0, 0, 0, 0)
GUICtrlSetBkColor($iInput, 0xFFFF88) ;0x00FF00
GUICtrlSetFont(-1, 10, 450)
GUICtrlSetState(-1, $GUI_HIDE)
$iListView = GUICtrlCreateListView('колонка 1|колонка 2|колонка 3', 5, 5, 740, 530)
GUICtrlSetFont(-1, 10, 450)
GUICtrlSetBkColor(-1, 0xc0c0c0)
$hListView = GUICtrlGetHandle($iListView)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_REPORT, $LVS_SHOWSELALWAYS), $LVS_EX_GRIDLINES)

$hListViewHeader = _GUICtrlListView_GetHeader($hListView)



;ZAPOLNYAEM
;~ $aMasiv = IniReadSection("DR.ini", "DR")
;~ _GUICtrlListView_AddArray($hListView, $aMasiv)


For $i = 1 To 20
	$item1 = Random(10, 99, 1)
	$item2 = ''
	For $j = 1 To 90
		$item2 &= Chr(Random(65, 90, 1)) ; 192, 255 - Ru
	Next
	$item3 = Random(10, 99, 1)
	GUICtrlCreateListViewItem($item1 & '|' & $item2 & '|' & $item3, $iListView) ; создаём пункты
Next


$aPos = ControlGetPos($hGUI, "", $hListView)
$iSrW = $aPos[2] / 3
For $i = 0 To 3;ubound($aMasiv, 2)
	_GUICtrlListView_SetColumnWidth($hListView, $i, -2)
	If _GUICtrlListView_GetColumnWidth($hListView, $i) > $iSrW Then _GUICtrlListView_SetColumnWidth($hListView, $i, $iSrW)
Next




$dummy1 = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_CE")
$dummy2 = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_SaveChange")
$dummy3 = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Resize")
Global $AccelKeys[2][2] = [["{ESC}", $dummy1],["{ENTER}", $dummy2]]
GUISetAccelerators($AccelKeys)

GUISetState()
GUIRegisterMsg(0x4E, "_WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ; для скрытия поля ввода при потере фокуса.

_GUICtrlListView_SetItemSelected($hListView, 0, True, True)
_GUICtrlListView_SetSelectedColumn($hListView, 0)



While 1
	Sleep(100)
WEnd



; Выводит элемент Input на передний план
Func _GUICtrlListView_EditItem($hWnd, $iIndex, $iSubItem)
	$iFlagEdit = 1
	;funkey 19.02.2010
	GUICtrlSetState($iInput, $GUI_HIDE)
	If $iIndex < 0 Then Return
	Local $aPos, $aRect, $iSum = 0
	Local $x, $y, $w, $h

	$aPos = ControlGetPos($hGUI, "", $hWnd)
	$aRect = _GUICtrlListView_GetSubItemRect($hListView, $iIndex, $iSubItem, 0)

	$x = $aPos[0] + _Max(0, $aRect[0]) + 4
	$y = $aRect[1] + 4
	;w
	If $aRect[0] >= 0 Then
		If $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem) <= $aPos[2] - 25 Then
			$w = _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
		Else
			$w = ($aPos[2] - 25) - $aRect[0]
		EndIf
	Else
		If $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem) <= $aPos[2] - 25 Then
			$w = $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
		Else
			$w = ($aPos[2] - 25)
		EndIf
	EndIf
	;==> w
	$h = $aRect[3] - $aRect[1]
	GUICtrlSetPos($iInput, $x - 1, $y, $w, $h + 5)
	GUICtrlSetData($iInput, _GUICtrlListView_GetItemText($hWnd, $iIndex, $iSubItem))
	GUICtrlSetState($iInput, $GUI_SHOW)
	;     ControlDisable($hGUI, "", $hListView)
	_GUIScrollBars_EnableScrollBar($hListView, $SB_HORZ, $ESB_DISABLE_BOTH)
	_GUIScrollBars_EnableScrollBar($hListView, $SB_VERT, $ESB_DISABLE_BOTH)

	ControlFocus($hGUI, "", $iInput)
	;Send("+{HOME}")
	Send("{HOME}")
	$aElement[0] = $iIndex
	$aElement[1] = $iSubItem
EndFunc   ;==>_GUICtrlListView_EditItem

; Сохранить изменения редактирования пункта
Func _SaveChange()
	Local $sText = GUICtrlRead($iInput)
	If StringInStr($sText, @CR) Or StringInStr($sText, @LF) Then
		If StringLeft($sText, 1) <> '"' And StringInStr(StringMid($sText, 2, StringLen($sText) - 2), '"') Then $sText = StringReplace($sText, '"', "'")
		$sText = '"' & StringReplace($sText, '"', '') & '"'
	EndIf
	_GUICtrlListView_BeginUpdate($hActive)
	_GUICtrlListView_SetItemText($hActive, $aElement[0], $sText, $aElement[1])
	GUICtrlSetState($iInput, $GUI_HIDE)
	;_GUICtrlListView_SetColumnWidth($hListView, $aElement[1], -2) ;$LVSCW_AUTOSIZE_USEHEADER
	_GUICtrlListView_EndUpdate($hActive)
	ControlEnable($hGUI, "", $hListView)
	_GUIScrollBars_EnableScrollBar($hListView, $SB_HORZ, $ESB_ENABLE_BOTH)
	_GUIScrollBars_EnableScrollBar($hListView, $SB_VERT, $ESB_ENABLE_BOTH)

	ControlFocus($hGUI, "", $hListView)
	$iFlagEdit = 0
	Return $sText ; возвращаем текст, если требуется его использовать после применения
EndFunc   ;==>_SaveChange

; Изменяем размер после того как изменилась ширина столбца
Func _Resize()
	If $iFlagEdit = 1 Then
		$hWnd = $hListView

		$iIndex = $aElement[0]
		$iSubItem = $aElement[1]


		GUICtrlSetState($iInput, $GUI_HIDE)
		If $iIndex < 0 Then Return
		Local $aPos, $aRect, $iSum = 0
		Local $x, $y, $w, $h

		$aPos = ControlGetPos($hGUI, "", $hWnd)
		$aRect = _GUICtrlListView_GetSubItemRect($hListView, $iIndex, $iSubItem, 0)

		$x = $aPos[0] + _Max(0, $aRect[0]) + 4
		$y = $aRect[1] + 4
		;w
		If $aRect[0] >= 0 Then
			If $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem) <= $aPos[2] - 25 Then
				$w = _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
			Else
				$w = ($aPos[2] - 25) - $aRect[0]
			EndIf
		Else
			If $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem) <= $aPos[2] - 25 Then
				$w = $aRect[0] + _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
			Else
				$w = ($aPos[2] - 25)
			EndIf
		EndIf
		;==> w
		$h = $aRect[3] - $aRect[1]
		GUICtrlSetPos($iInput, $x - 1, $y, $w, $h + 5)
;~     GUICtrlSetData($iInput, _GUICtrlListView_GetItemText($hWnd, $iIndex, $iSubItem))
		GUICtrlSetState($iInput, $GUI_SHOW)
		;     ControlDisable($hGUI, "", $hListView)
		_GUIScrollBars_EnableScrollBar($hListView, $SB_HORZ, $ESB_DISABLE_BOTH)
		_GUIScrollBars_EnableScrollBar($hListView, $SB_VERT, $ESB_DISABLE_BOTH)

		_GUICtrlListView_RedrawItems($hWnd, $iIndex, $iIndex)
		ControlFocus($hGUI, "", $iInput)
	EndIf
EndFunc   ;==>_Resize


Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $hWndFrom
		Case $hListView
			Switch $iCode
				Case $NM_CLICK, $NM_rCLICK
					Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
					Local $iIndex = DllStructGetData($tInfo, "Index")
					Local $iSubItem = DllStructGetData($tInfo, "SubItem")
					Local $sTextItem = _GUICtrlListView_GetItemText($hListView, $iIndex, $iSubItem)
					$iLastItemIndex = $iIndex
					$iLastSubItemIndex = $iSubItem
					$iFlagEdit = 0
					_GUIScrollBars_EnableScrollBar($hListView, $SB_HORZ, $ESB_ENABLE_BOTH)
					_GUIScrollBars_EnableScrollBar($hListView, $SB_VERT, $ESB_ENABLE_BOTH)
					_GUICtrlListView_SetSelectedColumn($hListView, $iLastSubItemIndex)
					$hActive = $hListView
					GUICtrlSetState($iInput, $GUI_HIDE)
					ControlFocus($hGUI, "", $hListView)
				Case $NM_DBLCLK ; двойной клик - редактируем пункт ListView
					Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
					_GUICtrlListView_EditItem($hListView, DllStructGetData($tInfo, "Index"), DllStructGetData($tInfo, "SubItem"))
					$hActive = $hListView
					;Case $NM_rCLICK ; если нужно будет под меню
				Case $LVN_KEYDOWN ; нажатие любой клавиши
					;Local $tInfo = DllStructCreate($tagNMLVKEYDOWN, $ilParam)
					;Local $Key = DllStructGetData($tInfo, "VKey")
					;ConsoleWrite("key pres " & $Key & @CRLF)
					Switch DllStructGetData(DllStructCreate($tagNMLVKEYDOWN, $ilParam), "VKey") ;DllStructGetData($tInfo, "VKey")
						Case 113, 32; f2, probel
							If $iLastItemIndex <> -1 And $iLastSubItemIndex <> -1 Then
								ConsoleWrite("RED " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
								_GUICtrlListView_EditItem($hListView, _GUICtrlListView_GetSelectedIndices($hListView), $iLastSubItemIndex)
								$hActive = $hListView
							EndIf
						Case 38; up
							If $iLastItemIndex - 1 >= 0 Then
								$iLastItemIndex = $iLastItemIndex - 1
								$aRect = _GUICtrlListView_GetSubItemRect($hListView, $iLastItemIndex, $iLastSubItemIndex)
								;_GUICtrlListView_Scroll($hListView, 0, -1 * ($aRect[3] - $aRect[1]))
								ConsoleWrite("step " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
							EndIf
						Case 40; down
							If _GUICtrlListView_GetItemCount($hListView) - 1 >= $iLastItemIndex + 1 Then

								$iLastItemIndex = $iLastItemIndex + 1
								$aRect = _GUICtrlListView_GetSubItemRect($hListView, $iLastItemIndex, $iLastSubItemIndex)
								;_GUICtrlListView_Scroll($hListView, 0, 1 * ($aRect[3] - $aRect[1]))
								ConsoleWrite("step " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
							EndIf
						Case 37; left
							If $iLastSubItemIndex - 1 >= 0 Then
								$iLastSubItemIndex = $iLastSubItemIndex - 1
								_GUICtrlListView_Scroll($hListView, -1 * (_GUICtrlListView_GetColumnWidth($hListView, $iLastSubItemIndex + 1)), 0)
								_GUICtrlListView_SetSelectedColumn($hListView, $iLastSubItemIndex)
								ConsoleWrite("step " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
							EndIf
						Case 39; right
							If _GUICtrlListView_GetColumnCount($hListView) - 1 >= $iLastSubItemIndex + 1 Then
								$iLastSubItemIndex = $iLastSubItemIndex + 1
								_GUICtrlListView_Scroll($hListView, 1 * (_GUICtrlListView_GetColumnWidth($hListView, $iLastSubItemIndex - 1)), 0)
								_GUICtrlListView_SetSelectedColumn($hListView, $iLastSubItemIndex)
								ConsoleWrite("step " & $iLastItemIndex & " " & $iLastSubItemIndex & @CRLF)
							EndIf
					EndSwitch
			EndSwitch
		Case $hListViewHeader
			Switch $iCode
				;                 Case $HDN_BEGINTRACK, $HDN_BEGINTRACKW ; Notifies a header control's parent window that the user has begun dragging a divider in the control
				;                     $tNMHEADER = DllStructCreate($tagNMHEADER, $ilParam)
				;                     ConsoleWrite("$HDN_BEGINTRACK --> hWndFrom:" & DllStructGetData($tNMHEADER, "hWndFrom") & " | IDFrom:" & DllStructGetData($tNMHEADER, "IDFrom") & @CR)
				;                     ConsoleWrite("$HDN_BEGINTRACK --> Code:" & @TAB & DllStructGetData($tNMHEADER, "Code") & " | Item:" & @TAB & DllStructGetData($tNMHEADER, "Item") & @CR)
				;                     ConsoleWrite("$HDN_BEGINTRACK --> Button:" & @TAB & DllStructGetData($tNMHEADER, "Button") & @CR)
				;                     Return False ; To allow tracking of the divider
				Case $HDN_ENDTRACK, $HDN_ENDTRACKW, $HDN_DIVIDERDBLCLICKW ; Notifies a header control's parent window that the user has begun dragging a divider in the control
					$tNMHEADER = DllStructCreate($tagNMHEADER, $ilParam)
					;                     ConsoleWrite("$HDN_ENDTRACK > hWndFrom:" & DllStructGetData($tNMHEADER, "hWndFrom") & " | IDFrom:" & DllStructGetData($tNMHEADER, "IDFrom") & @CR)
					;                     ConsoleWrite("$HDN_ENDTRACK > Code:" & @TAB & DllStructGetData($tNMHEADER, "Code") & " | Item:" & @TAB & DllStructGetData($tNMHEADER, "Item") & @CR)
					;                     ConsoleWrite("$HDN_ENDTRACK > Button:" & @TAB & DllStructGetData($tNMHEADER, "Button") & @CR)
					GUICtrlSendToDummy($dummy3, 1)
					Return False ; To allow tracking of the divider
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_NOTIFY

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
	#forceref $hWnd, $iMsg
	Local $iIDFrom, $iCode
	$iIDFrom = BitAND($iwParam, 0xFFFF) ; младшее слово
	$iCode = BitShift($iwParam, 16) ; старшее слово
	Switch $iIDFrom
		Case $iInput
			Switch $iCode
				Case $EN_KILLFOCUS
;~                  GUICtrlSetState($iInput, $GUI_HIDE)
;~                  ControlEnable($hGUI, "", $hListView)
;~                  ControlFocus($hGUI, "", $hListView)
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND


Func _CE()
	GUICtrlSetState($iInput, $GUI_HIDE)
	ControlEnable($hGUI, "", $hListView)
	_GUIScrollBars_EnableScrollBar($hListView, $SB_HORZ, $ESB_ENABLE_BOTH)
	_GUIScrollBars_EnableScrollBar($hListView, $SB_VERT, $ESB_ENABLE_BOTH)
	$iFlagEdit = 0

	ControlFocus($hGUI, "", $hListView)
EndFunc   ;==>_CE


Func _Exit()
	Exit
EndFunc   ;==>_Exit
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
kokseek
Артефакты пока ещё присутствуют, поле бывает прыгает в стороны не согласно колонкам.
 
Верх