- Сообщения
- 3,556
- Репутация
- 628
Общее окно. В нем второе, прозрачное. В этом втором окне создан TreeView. Иконки устанавливаю свои. При клике мышью на область иконки она меняется на другую, в зависимости какой тип установлен.
Проблема: Иконки квадратные и круглые(эмуляция чекбоса и радиокнопки. Реальных чекбоксов нет, те что устанавливаются стилем). Когда чек пустой то при клике устанавливается чек с отметкой. Если навести мышку точно на изображение(галка), то при клике ничего не происходит. Не регистрируется выбор элемента TreeView. Если мышку сместить буквально на пару пикселей(на белое поле чекбокса), то все регистрации проходят. В чем глюк?
Для теста ссылка https://yadi.sk/d/V2EyAf_432Ydo9
Запустить программу, выбрать файл настроек(он в архиве) через меня Файл или Alt+3. Потом нажать F5. Запустится тестовый модуль. Кнопкой Далее перейти на страницу где будет отображаться TreeView. Там можно будет проверить то, что писал выше.
Если кто-то сталкивался с такой проблемой, то буду благодарен за пояснение.
Могу выложить в исходниках, но без компиляции тест не запустишь.
Ниже код опроса 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]))
проблем с установкой иконок нет, только та, что описана выше.