Что нового

TreeView не регистрирует клик мышью

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Общее окно. В нем второе, прозрачное. В этом втором окне создан TreeView. Иконки устанавливаю свои. При клике мышью на область иконки она меняется на другую, в зависимости какой тип установлен.
Проблема: Иконки квадратные и круглые(эмуляция чекбоса и радиокнопки. Реальных чекбоксов нет, те что устанавливаются стилем). Когда чек пустой то при клике устанавливается чек с отметкой. Если навести мышку точно на изображение(галка), то при клике ничего не происходит. Не регистрируется выбор элемента TreeView. Если мышку сместить буквально на пару пикселей(на белое поле чекбокса), то все регистрации проходят. В чем глюк?
Для теста ссылка https://yadi.sk/d/V2EyAf_432Ydo9
Запустить программу, выбрать файл настроек(он в архиве) через меня Файл или Alt+3. Потом нажать F5. Запустится тестовый модуль. Кнопкой Далее перейти на страницу где будет отображаться TreeView. Там можно будет проверить то, что писал выше.
Если кто-то сталкивался с такой проблемой, то буду благодарен за пояснение.
Могу выложить в исходниках, но без компиляции тест не запустишь.
Ниже код опроса TreeView на события
Код:
Func _GUITreeViewEx($hWnd, $iMsg, $wParam, $lParam)
	#forceref $hWnd, $iMsg, $wParam
	Local $hItem
	Local $tStruct = DllStructCreate("struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;" & _
			"uint Action;struct;uint OldMask;handle OldhItem;uint OldState;uint OldStateMask;" & _
			"ptr OldText;int OldTextMax;int OldImage;int OldSelectedImage;int OldChildren;lparam OldParam;endstruct;" & _
			"struct;uint NewMask;handle NewhItem;uint NewState;uint NewStateMask;" & _
			"ptr NewText;int NewTextMax;int NewImage;int NewSelectedImage;int NewChildren;lparam NewParam;endstruct;" & _
			"struct;long PointX;long PointY;endstruct", $lParam)
;~ 	Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	Local $hWndFrom = DllStructGetData($tStruct, "hWndFrom")
	If $hWndFrom = $g_GTVEx_aTVData Then
		Switch DllStructGetData($tStruct, "Code")
			Case $TVN_SELCHANGEDW, $TVN_SELCHANGEDA
				$hItem = DllStructGetData($tStruct, "NewhItem")
				If $hItem Then
					If $notselect Then
						_GUICtrlTreeView_SetState($g_GTVEx_aTVData, $hItem, $TVIS_SELECTED, False)
					Else
						_GUICtrlTreeView_SetBold($g_GTVEx_aTVData, $bold, False)
						_GUICtrlTreeView_SetBold($g_GTVEx_aTVData, $hItem, True)
						$bold = $hItem
					EndIf
					$g_GTVEx_hItemSelected = $hItem
					$sPathData = $hItem
				EndIf
				$g_GTVEx_aTVData = $hWndFrom
;~ 			Case $TVN_KEYDOWN
;~ 				Local $tInfo = DllStructCreate($tagNMTVKEYDOWN, $lParam)
;~ 				Local $Key = DllStructGetData($tInfo, "VKey")
;~ 				Switch $Key
;~ 					Case 0x20
;~ 						Local $hItems = _GUICtrlTreeView_GetSelection($g_GTVEx_aTVData)
;~ 						If $hItems Then $g_GTVEx_hItemSelected = $hItems
;~ 				EndSwitch
;~ 				$g_GTVEx_aTVData = $hWndFrom
			Case $TVN_BEGINDRAGA, $TVN_BEGINDRAGW
				$hItem = DllStructGetData($tStruct, "NewhItem")
				If Not $notselect Then
					$movtxt = _GUICtrlTreeView_GetText($g_GTVEx_aTVData, $hItem)
					$bTreeDrag = True
					$hDragItem = TreeItemFromPoint($g_GTVEx_aTVData)
					_GUICtrlTreeView_SetSelected($g_GTVEx_aTVData, _GUICtrlTreeView_GetSelection($g_GTVEx_aTVData), False)
					_GUICtrlTreeView_SetBold($g_GTVEx_aTVData, $bold, False)
					_GUICtrlTreeView_SetBold($g_GTVEx_aTVData, $hItem, True)
					$g_GTVEx_hItemSelected = $hItem
					$sPathData = $hItem
					$bold = $hItem
				EndIf
				$g_GTVEx_aTVData = $hWndFrom
			Case $TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW
				If Not $notselect Then
					Local $tInfo = DllStructCreate($tagNMHDR & ";" & $tagTVITEMEX, $lParam)
					If DllStructGetData($tInfo, "Text") <> 0 Then
						Local $tBuffer = DllStructCreate("wchar Text[" & DllStructGetData($tInfo, "TextMax") & "]", DllStructGetData($tInfo, "Text"))
						Local $txt = StringStripWS(DllStructGetData($tBuffer, "Text"), 3)
						If $txt Then
							_GUICtrlTreeView_SetText($g_GTVEx_aTVData, _GUICtrlTreeView_GetSelection($g_GTVEx_aTVData), StringRegExpReplace(DllStructGetData($tBuffer, "Text"), '[*~|#]', ' '))
							_TextSet()
						EndIf
					EndIf
				EndIf
				$g_GTVEx_aTVData = $hWndFrom
		EndSwitch
	EndIf
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_GUITreeViewEx
Ничего особенного, но для наглядности
лист иконок создаю так
Код:
$imlc = _GUIImageList_Create(16, 16, 5, 3)
	_GUIImageList_AddIcon($imlc, $tDir & '\chk.ico')
	_GUIImageList_AddIcon($imlc, $tDir & '\unchk.ico')
	_GUIImageList_AddIcon($imlc, $tDir & '\rd.ico')
	_GUIImageList_AddIcon($imlc, $tDir & '\unrd.ico')
	_GUICtrlTreeView_SetStateImageList($g_GTVEx_aTVData, $imlc)
устанавливаю иконки так
Код:
_GUICtrlTreeView_SetStateImageIndex($g_GTVEx_aTVData, $hChild, Number($infoparam[7]))

проблем с установкой иконок нет, только та, что описана выше.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joiner
Если навести мышку точно на изображение(галка), то при клике ничего не происходит
Дело в том, что все чёрные пиксели, рисующие "галку" - это Static1. И вообще все чёрные пиксели этого поля - это Static1. Следовательно, все клики в чёрные пиксели уходят в Static1. Можете даже между цифр кликнуть или внутрь нуля - всё уйдёт на обработку в Static1.
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Я обратил внимание, что в превью в папке эта иконка видится с более серой галкой. а на черном фоне галка черная. получается что рисунок имеет прозрачность.
верно, если кликать между буквами то клик уходит в первое окно. если нацелиться и кликнуть в название пункта, то будет действие(в линию знака)
клик по пунктам мне не нужен. главное - регистрация клика по иконке.
вобщем, нашел другую иконку и все работает.
в принципе надо было самому догадаться :smile: . Кнопки по такому же типу сделаны.
Но все-равно спасибо
 
Верх