Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


А вот пример по перетаскиванию:

Код: Выделить весь код
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>
#include <GUIImageList.au3>
;

Global $iLast_Index = -1
Global $a_Index[2] ;From and to
Global $iLastLineTop, $iLastLineLeft

Global $iDragging = False
Global $iDrawing = False ;To ensure mousemove doesn't cause more than one line to be drawn
Global $iLButtonIsUp = False ;To ensure a correct redraw of ListView

$Main_GUI = GUICreate("Drag & Drop LV Item", 225, 400, -1, -1, BitOR($WS_THICKFRAME, $WS_SIZEBOX))

$ListView = GUICtrlCreateListView("Entry Name|Category", 5, 75, 195, 280, $LVS_SINGLESEL)
$h_ListView = GUICtrlGetHandle($ListView)

_GUICtrlListView_SetColumnWidth($ListView, 0, 100)
_GUICtrlListView_SetColumnWidth($ListView, 1, 100)

GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_CHECKBOXES, $LVS_EX_CHECKBOXES)

GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_SUBITEMIMAGES, $LVS_EX_SUBITEMIMAGES)

$h_ImageList = _GUIImageList_Create(20, 20, 5, 0, 4, $LVSIL_SMALL)

For $i = 0 To 10
	_GUIImageList_AddIcon($h_ImageList, @SystemDir & "\shell32.dll", $i)
Next

_GUICtrlListView_SetImageList($h_ListView, $h_ImageList, $LVSIL_SMALL)

For $i = 0 To 9
	GUICtrlCreateListViewItem("Name " & $i & "|Category " & $i, $ListView)
	_GUICtrlListView_SetItemImage($h_ListView, $i, $i, 0); listview handle, index, subitem, image index
Next

GUISetState()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY_EVENTS")
GUIRegisterMsg($WM_LBUTTONUP, "WM_LBUTTONUP_EVENTS")
GUIRegisterMsg($WM_MOUSEMOVE, "WM_MOUSEMOVE_EVENTS")

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			_GUIImageList_Destroy($h_ImageList)
			Exit
	EndSwitch
	
	If $iLButtonIsUp Then
		$iLButtonIsUp = False
		DllCall("User32.dll", "int", "RedrawWindow", "hwnd", $h_ListView, "ptr", 0, "int", 0, "int", 5)
	EndIf
WEnd

Func WM_LBUTTONUP_EVENTS($hWndGUI, $MsgID, $wParam, $lParam)
	$iLButtonIsUp = True
	$iDragging = False
	$iDrawing = False
	
	$iLast_Index = -1
	
	Local $aLV_Pos = ControlGetPos($hWndGUI, "", $ListView)
	
	Local $iX = BitAND($lParam, 0xFFFF) - $aLV_Pos[0]
	Local $iY = BitShift($lParam, 16) - $aLV_Pos[1]
	
	Local $struct_LVHITTESTINFO = DllStructCreate("int;int;uint;int;int;int")
	
	DllStructSetData($struct_LVHITTESTINFO, 1, $iX)
	DllStructSetData($struct_LVHITTESTINFO, 2, $iY)

	$a_Index[1] = GUICtrlSendMsg($ListView, $LVM_HITTEST, 0, DllStructGetPtr($struct_LVHITTESTINFO))
	Local $iFlags = DllStructGetData($struct_LVHITTESTINFO, 2)

	;// Out of the ListView?
	If $a_Index[1] == -1 Then Return $GUI_RUNDEFMSG
	
	;// Not in an item?
	If BitAND($iFlags, $LVHT_ONITEMLABEL) == 0 And BitAND($iFlags, $LVHT_ONITEMSTATEICON) == 0 Then Return $GUI_RUNDEFMSG
	
	If $a_Index[0] <> $a_Index[1] Then
		;ConsoleWrite($a_Index[0] & " ==> " & $a_Index[1] & @CRLF)
		_GUICtrlListView_CopyItem($h_ListView, $h_ListView, $a_Index[0], $a_Index[1], 1)
	EndIf
	
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_LBUTTONUP_EVENTS

Func WM_MOUSEMOVE_EVENTS($hWndGUI, $MsgID, $wParam, $lParam)
	If Not $iDragging Or $iDrawing Then Return $GUI_RUNDEFMSG
	
	Local $aLV_Pos = ControlGetPos($hWndGUI, "", $ListView)
	
	Local $iX = BitAND($lParam, 0xFFFF) - $aLV_Pos[0]
	Local $iY = BitShift($lParam, 16) - $aLV_Pos[1]
	
	Local $struct_LVHITTESTINFO = DllStructCreate("int;int;uint;int;int;int")
	
	DllStructSetData($struct_LVHITTESTINFO, 1, $iX)
	DllStructSetData($struct_LVHITTESTINFO, 2, $iY)
	
	Local $iItem = GUICtrlSendMsg($ListView, $LVM_HITTEST, 0, DllStructGetPtr($struct_LVHITTESTINFO))
	If $iItem = -1 Then Return $GUI_RUNDEFMSG
	
	If $iLast_Index = $iItem Then Return $GUI_RUNDEFMSG
	
	If $iLast_Index > $iItem Then ;Move up
		_GUICtrlListView_RedrawItems($ListView, $iItem, $iLast_Index)
	Else
		_GUICtrlListView_RedrawItems($ListView, $iLast_Index, $iItem - 1)
	EndIf
	
	$iLast_Index = $iItem
	
	Local $aLV_Pos = ControlGetPos($hWndGUI, "", $ListView)
	Local $iY = _GUICtrlListView_GetItemPositionY($ListView, $iItem)
	
	If $iY <= 0 Then Return $GUI_RUNDEFMSG
	
	_DrawLine($aLV_Pos[0], $iY, $aLV_Pos[2], 2, 0x0000FF, $h_ListView)
EndFunc   ;==>WM_MOUSEMOVE_EVENTS

Func WM_NOTIFY_EVENTS($hWndGUI, $MsgID, $wParam, $lParam)
	Local $tagNMHDR, $iEvent, $hwndFrom, $iCode, $iItem
	
	$tagNMHDR = DllStructCreate("int;int;int;int", $lParam) ;NMHDR (hwndFrom, idFrom, code, Item)
	If @error Then Return $GUI_RUNDEFMSG
	
	$iCode = DllStructGetData($tagNMHDR, 3)
	$iItem = DllStructGetData($tagNMHDR, 4)
	
	Switch $wParam
		Case $ListView
			Switch $iCode
				Case $LVN_BEGINDRAG
					$a_Index[0] = $iItem
					$iDragging = True
					
					;_GUICtrlListView_SetItemSelected($ListView, $iItem, False)
			EndSwitch
	EndSwitch
	
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY_EVENTS

Func _GUICtrlListView_CopyItem($hWnd_Source, $hWnd_Destination, $iSrcIndex, $iDstIndex, $fDelFlag = False)
	Local $iInsert_Index
	Local $tItem = DllStructCreate($tagLVITEM)
	
	Local $iCols = _GUICtrlListView_GetColumnCount($hWnd_Source)
	Local $iItems = _GUICtrlListView_GetItemCount($hWnd_Source)
	Local $iDest_Items = _GUICtrlListView_GetItemCount($hWnd_Destination)
	
	_GUICtrlListView_BeginUpdate($hWnd_Source)
	If $hWnd_Destination <> $hWnd_Source Then _GUICtrlListView_BeginUpdate($hWnd_Destination)
	
	DllStructSetData($tItem, "Mask", BitOR($LVIF_GROUPID, $LVIF_IMAGE, $LVIF_INDENT, $LVIF_PARAM, $LVIF_STATE))
	DllStructSetData($tItem, "Item", $iSrcIndex)
	DllStructSetData($tItem, "SubItem", 0)
	DllStructSetData($tItem, "StateMask", -1)
	
	_GUICtrlListView_GetItemEx($hWnd_Source, $tItem)
	
	If $iDstIndex > $iSrcIndex Then
		$iDstIndex += 1
	ElseIf $iSrcIndex > $iDstIndex Then
		$iSrcIndex += 1
	EndIf
	
	$iInsert_Index = _GUICtrlListView_InsertItem($hWnd_Destination, _
			_GUICtrlListView_GetItemText($hWnd_Source, $iSrcIndex, 0), $iDstIndex, DllStructGetData($tItem, "Image"))
	
	If BitAND(_GUICtrlListView_GetExtendedListViewStyle($hWnd_Source), $LVS_EX_CHECKBOXES) == $LVS_EX_CHECKBOXES Then
		If _GUICtrlListView_GetItemChecked($hWnd_Source, $iSrcIndex) Then _
				_GUICtrlListView_SetItemChecked($hWnd_Destination, $iInsert_Index)
	EndIf
	
	For $i = 0 To $iCols - 1
		DllStructSetData($tItem, "Item", $iInsert_Index)
		DllStructSetData($tItem, "SubItem", $i)
		
		_GUICtrlListView_GetItemEx($hWnd_Source, $tItem)
		
		_GUICtrlListView_AddSubItem($hWnd_Destination, $iInsert_Index, _
				_GUICtrlListView_GetItemText($hWnd_Source, $iSrcIndex, $i), $i, DllStructGetData($tItem, "Image"))
	Next
	
	If $fDelFlag Then _GUICtrlListView_DeleteItem($hWnd_Source, $iSrcIndex)
	
	If $iDstIndex > $iSrcIndex Then $iDstIndex -= 1
	_GUICtrlListView_SetItemSelected($hWnd_Source, $iDstIndex)
	
	_GUICtrlListView_EndUpdate($hWnd_Source)
	If $hWnd_Destination <> $hWnd_Source Then _GUICtrlListView_EndUpdate($hWnd_Destination)
	
	_GUICtrlListView_RedrawItems($hWnd_Destination, $iSrcIndex, $iDstIndex)
	;DllCall("User32.dll", "int", "RedrawWindow", "hwnd", $hWnd_Destination, "ptr", 0, "int", 0, "int", 5)
EndFunc   ;==>_GUICtrlListView_CopyItem

Func _DrawLine($iLeft, $iTop, $iWidth, $iHeight, $sColor, $hWnd = 0)
	$iDrawing = True
	$sColor = Hex("0x" & BitAND(BitShift(String(Binary($sColor)), 8), 0xFFFFFF)) ;RGB2BGR
	
	Local $hDC = DllCall("User32.dll", "int", "GetDC", "hwnd", $hWnd)
	Local $aPen = DllCall("GDI32.dll", "int", "CreatePen", "int", 0, "int", $iHeight, "int", $sColor)
	
	DllCall("GDI32.dll", "int", "SelectObject", "int", $hDC[0], "int", $aPen[0])
	
	If $iLastLineTop > -1 And $iLastLineLeft > -1 Then
		If $iLastLineTop <> $iTop Then ; or $iLastLineLeft <> $iLeft Then
			;Local $strRect = DllStructCreate("int[4]")
			
			;DllStructSetData($strRect, 1, 5)
			;DllStructSetData($strRect, 2, 75)
			;DllStructSetData($strRect, 3, 198 + 5)
			;DllStructSetData($strRect, 4, 280 + 75)
			
			;Local $pRect = DllStructGetPtr($strRect)
			
			$iLastLineLeft = $iLeft
			$iLastLineTop = $iTop
			
			DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hWnd, "int", 0, "int", 1)
			Sleep(50) ;seems to be needed to ensure redrawn before line is drawn
		EndIf
	EndIf
	
	DllCall("GDI32.dll", "int", "MoveToEx", "hwnd", $hDC[0], "int", $iLeft, "int", $iTop, "int", 0)
	DllCall("GDI32.dll", "int", "LineTo", "hwnd", $hDC[0], "int", $iLeft + $iWidth, "int", $iTop)
	
	DllCall("user32.dll", "int", "ReleaseDC", "hwnd", $hWnd, "int", $hDC[0])
	DllCall("GDI32.dll", "int", "DeleteObject", "int", $aPen[0])
	
	$iDrawing = False
EndFunc   ;==>_DrawLine

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 01:09, 15-11-2009 | #3