※ 이 문서는 뭐 그냥 하면 되지. ()에서 인쇄하였으며,
저작권은 해당 블로그 운영자에게 있습니다.

ListView에서 다른 컨트롤로 내용 끌어놓기(Drag & Drop)

/Autoit/AutoIt :: 2009. 3. 15. 13:06

ListView에서 다른 컨트롤로 내용 끌어놓기(Drag & Drop)

원본 보기 by MrCreatoR

원본은 리스트뷰에서 옆에 있는 에디트로 리스트뷰의 내용을 끌어놓는 소스입니다. 굳이 에디트 컨트롤이 아니라 어디에라도 끌어놓기(드래그 드롭, Drag & Drop)를 하면 해당 내용이 에디트 컨트롤에 표시가 되죠.

이걸 조금 더 발전시켜서 정해진 자리에 끌어놓기를 해야만 변화가 생기는 방법을 추가하였습니다.

 

끌어놓기 할 때 마우스를 놓는 위치와 컨트롤의 위치를 비교하여 컨트롤의 위치에 해당할 때만 값에 변화를 주는 방법입니다.

이걸 여러 컨트롤을 만들고 각각의 위치와 마우스의 위치를 비교하는 내용을 추가하면 아래 소스처럼 됩니다.

사실 더 확실 방법이 있긴 한데, 이 방법이 쉬어서 이걸로 택했습니다.

값을 읽어서 변화를 주는 부분만 바꾼다면, 여러 가지 형태로 응용할 수 있습니다.

포함한 예제는 리스트뷰에 파일 목록이 나오고 목록에서 하나를 선택하여 다른 컨트롤 영역으로 끌어놓기를 하면 리스트뷰 아이템의 값을 컨트롤에 표시해주는 예제입니다.

;~ http://www.autoitscript.com/forum/index.php?showtopic=49459&view=findpost&p=380300
;~ MrCreatoR

#include <GUIConstantsEx.au3>
#include <GUIListView.au3>
#include <ListviewConstants.au3>
#include <WindowsConstants.au3>

Opt('MouseCoordMode', 2)

Global $GUIControl[13]
$hGUI = GUICreate("Drag & Drop Test", 420, 600)

$ListView = GUICtrlCreateListView("ListView", 10, 10, 400, 100)
_GUICtrlListView_SetColumnWidth(-1, 0, $LVSCW_AUTOSIZE_USEHEADER)

Opt('GUICoordMode', 2)
$GUIControl[1] = GUICtrlCreateGroup('그룹', -400, 10, 400, 30)
$GUIControl[2] = GUICtrlCreateLabel('라벨', -400, 10)
$GUIControl[3] = GUICtrlCreateButton('버튼', -400, 10)
$GUIControl[4] = GUICtrlCreateCheckbox('체크박스', -400, 10)
$GUIControl[5] = GUICtrlCreateRadio('라디오', -400, 10)
$GUIControl[6] = GUICtrlCreateCombo('콤보', -400, 10)
$GUIControl[7] = GUICtrlCreateInput('인풋', -400, 10)
$GUIControl[8] = GUICtrlCreateEdit('에디트', -400, 10, 400, 30, $WS_VSCROLL)
$GUIControl[9] = GUICtrlCreateList('리스트박스', -400, 10)
$GUIControl[10] = GUICtrlCreateListView('리스트뷰', -400, 10)
$GUIControl[11] = GUICtrlCreateProgress(-400, 10)
$GUIControl[12] = GUICtrlCreateSlider(-400, 10)

For $i = 20 To 100 Step 20
	GUICtrlCreateListViewItem($i, $ListView)
Next

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_EVENT_PRIMARYDOWN
			Local $CurInfo = GUIGetCursorInfo($hGUI)
			If IsArray($CurInfo) And $CurInfo[4] = $ListView Then
				Local $SelText = GetSelectedText($ListView)
				While IsArray($CurInfo) And $CurInfo[2] = 1
					$CurInfo = GUIGetCursorInfo($hGUI)
					Sleep(10)
				WEnd
				$Mouse_pos = MouseGetPos()
				For $i = 1 To UBound($GUIControl) - 1
					Local $Return = 0
					$pos = ControlGetPos($hGUI, '', $GUIControl[$i])
					If $SelText <> "" And IsArray($CurInfo) And $CurInfo[4] <> $ListView And _
							$Mouse_pos[0] > $pos[0] And $Mouse_pos[0] < $pos[0] + $pos[2] And _
							$Mouse_pos[1] > $pos[1] And $Mouse_pos[1] < $pos[1] + $pos[3] Then _
							$Return = 1
					GUICtrlSetData($GUIControl[$i], '')
					If $Return = 1 Then
						GUICtrlSetData($GUIControl[$i], $SelText)
					Else
						GUICtrlSetData($GUIControl[$i], '0')
					EndIf
				Next
			Else
			EndIf
	EndSwitch
WEnd

Func GetSelectedText($ListView)
	Local $ItemIndexArr = _GUICtrlListView_GetSelectedIndices($ListView, 1)
	If Not IsArray($ItemIndexArr) Then Return SetError(1, 0, -1)
	Local $SelText = "", $Ubound = UBound($ItemIndexArr) - 1, $CRLF = @CRLF

	For $i = 1 To $Ubound
		If $i = $Ubound Then $CRLF = ""
		$SelText &= _GUICtrlListView_GetItemText($ListView, $ItemIndexArr[$i], 0) & $CRLF
	Next
	Return $SelText
EndFunc   ;==>GetSelectedText


블로그의 글과 그림, 첨부파일의 복제, 재배포를 금지합니다. =>  자세히 보기
티스토리 초대장 필요하신 분은 댓글남겨주세요.
give start - 굿네이버스 - 사랑의 열매 - 아름다운재단 - 어린이재단 - 유니세프
굿네이버스 배너
사랑의 열매 배너
아름다운 재단 배너 어린이 재단 배너 유니세프 한국위원회 - 배너