Что нового

Как сделать Drag and drop в TreeView

pvnn

Осваивающий
Сообщения
305
Репутация
32
Всем привет. Как сделать Drag and drop в TreeView?
Нашел как можно получить дескриптор перетаскиваемого объекта
Код:
Case $TVN_BEGINDRAGA, $TVN_BEGINDRAGW

А как определить куда перетаскивать. Какие события за это отвечают в WM_NOTIFY()

Код:
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>
#include <Array.au3>
#include <GuiListView.au3>


$Form1 = GUICreate("Form1", 400, 436, -1, -1)
; TreeView
$iStyle=BitOR($TVS_HASBUTTONS,$TVS_HASLINES,$TVS_LINESATROOT,$TVS_SHOWSELALWAYS)
$hTreeView =_GUICtrlTreeView_Create($Form1,8, 8, 225, 433,$iStyle,$WS_EX_CLIENTEDGE)
_GUICtrlTreeView_AddFirst($hTreeView,0,'Первый')
$test=_GUICtrlTreeView_Add($hTreeView,0,'Второй')
_GUICtrlTreeView_AddChild($hTreeView,$test,'1')
_GUICtrlTreeView_AddChild($hTreeView,$test,'2')
_GUICtrlTreeView_Expand($hTreeView,$test)  ; Развернуть пункт

; Изображения
  $hImage = _GUIImageList_Create(16, 16, 5)
 _GUIImageList_AddIcon($hImage,'C:\Windows\system32\imageres.dll',4)
 _GUICtrlTreeView_SetNormalImageList($hTreeView, $hImage)



GUISetState(@SW_SHOW)
 GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd



; Show a menu in a given GUI window which belongs to a given GUI ctrl
Func ShowMenu($hWnd, $nContextID, $nContextControlID, $iMouse=0)
    Local $hMenu = GUICtrlGetHandle($nContextID)
    Local $iCtrlPos = ControlGetPos($hWnd, "", $nContextControlID)

    Local $X = $iCtrlPos[0]
    Local $Y = $iCtrlPos[1] + $iCtrlPos[3]

    ClientToScreen($hWnd, $X, $Y)

    If $iMouse Then
        $X = MouseGetPos(0)
        $Y = MouseGetPos(1)
    EndIf

    DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $X, "int", $Y, "hwnd", $hWnd, "ptr", 0)
EndFunc

; Convert the client (GUI) coordinates to screen (desktop) coordinates
Func ClientToScreen($hWnd, ByRef $x, ByRef $y)
    Local $stPoint = DllStructCreate("int;int")

    DllStructSetData($stPoint, 1, $x)
    DllStructSetData($stPoint, 2, $y)

    DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))

    $x = DllStructGetData($stPoint, 1)
    $y = DllStructGetData($stPoint, 2)
    ; release Struct not really needed as it is a local
    $stPoint = 0
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	#forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom,  $iCode, $tNMHDR, $hWndTreeView, $tInfo

    $hWndTreeView = $hTreeView
    If Not IsHWnd($hTreeView) Then $hWndTreeView = GUICtrlGetHandle($hTreeView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom
        Case $hWndTreeView
            Switch $iCode
				Case $TVN_BEGINDRAGA, $TVN_BEGINDRAGW
                    $tPoint = _WinAPI_GetMousePos(1, $hWndFrom)
                    $tTVHTI = _GUICtrlTreeView_HitTestEx($hWndFrom, DllStructGetData($tPoint, 1, 1), DllStructGetData($tPoint, 2))
                    $hItem =DllStructGetData($tTVHTI, 'Item')
					$TreeGroupText=_GUICtrlTreeView_GetText($hTreeView,$hItem)  ; Текст
					ConsoleWrite(@CRLF&$TreeGroupText)

            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
pvnn
ты хочешь сделать перетаскивание пунктов?
http://autoit-script.ru/index.php?topic=13568.msg86221#msg86221
я реализовал это в своей программе http://autoit-script.ru/index.php?topic=21204.0
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
joiner, да хотелось бы сделать перетаскивание пунктов
Посмотрел первую ссылку (пример от CreatoR)

joiner, меня смущает это:
Код:
Opt("GUIOnEventMode", 1)

Можно ли реализовать перетаскивание пунктов с отключенным режимом уведомления OnEvent?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ну тут смущаться не от чего. просто всю работу с GUI перевести на OnEvent - нажатие на кнопки и прочие действия
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
joiner, в этом то и проблема, у меня уже есть готовая программа с кучей контролов и все переводить в OnEvent будет проблематично. Тогда мне проще отказаться от перетаскивания пунктов. Жаль, что по-другому никак нельзя решить :(
 
Верх