Что нового

Перемещение контролов методом drag&drop.

Heler

Знающий
Сообщения
70
Репутация
11
Всем привет! Необходимо перемещать контролы(GUICtrlCreatePic) методом Drag&Drop. Пытался сделать сам, но не получилось. Помогите пожалуйста :smile:
Фон картинкой обязателен. Скрипт и картинки в аттаче.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("MouseCoordMode", 0)

Global $state = 0
GUICreate('Program', 541, 340, -1, -1)
GUICtrlCreatePic(@ScriptDir&'\background.jpg', 0, 0, 541, 340)
$hImage1 = GUICtrlCreatePic(@ScriptDir&'\1.jpg',120, 63, 85, 111)
$hImage2 = GUICtrlCreatePic(@ScriptDir&'\2.jpg',340, 63, 85, 111)
GUISetState()

GUIRegisterMsg ($WM_LBUTTONDOWN, "WM_LBUTTONUP_FUNC")
GUIRegisterMsg ($WM_LBUTTONUP, "WM_LBUTTONDOWN_FUNC")
Do
	If $state Then
		$aCursorInfo = GUIGetCursorInfo()
		$aMousePos = MouseGetPos()
		GUICtrlSetPos($aCursorInfo[4], $aMousePos[0]-45, $aMousePos[1]-80 )
	Endif
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_LBUTTONUP_FUNC()
   $state = 1
EndFunc

Func WM_LBUTTONDOWN_FUNC()
	$state = 0
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Можно так:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

#include "GUICtrlOnHover.au3"

Opt("MouseCoordMode", 0)
Global $iPressed = 0, $iLastCtrlID = -1

GUICreate('Program', 541, 340, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_CLIPCHILDREN))

GUICtrlCreatePic(@ScriptDir & '\background.jpg', 0, 0, 541, 340)
GUICtrlSetState(-1, $GUI_DISABLE)

$hImage1 = GUICtrlCreatePic(@ScriptDir & '\1.jpg',120, 63, 85, 111)
_GUICtrl_OnHoverRegister(-1, "OnHover_Func", -1, "OnPrimaryDown_Func", "OnPrimaryUp_Func")
$hImage2 = GUICtrlCreatePic(@ScriptDir & '\2.jpg',340, 63, 85, 111)
_GUICtrl_OnHoverRegister(-1, "OnHover_Func", -1, "OnPrimaryDown_Func", "OnPrimaryUp_Func")

GUISetState()

Do
	If $iPressed Then
		$aMousePos = MouseGetPos()
		GUICtrlSetPos($iLastCtrlID, $aMousePos[0]-45, $aMousePos[1]-80)
	Endif
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func OnHover_Func($iCtrlID)
   
EndFunc

Func OnPrimaryDown_Func($iCtrlID)
	$iLastCtrlID = $iCtrlID
	$iPressed = 1
EndFunc

Func OnPrimaryUp_Func($iCtrlID)
	$iLastCtrlID = -1
	$iPressed = 0
EndFunc


GUICtrlOnHover.au3
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
CreatoR, спасибо работает. Но заметил не очень приятную особенность. Если положить один контрол на другой, и потом кликнуть на нижний, то получаем отпечаток картинки с другого контрола. Есть идеи как пофиксить? Я придумал при занесении контрола 1 на територию контрола 2, передвигать контрол 2.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Heler [?]
заметил не очень приятную особенность
Решается так:

Код:
...

#include <WinAPI.au3>

...

Func OnPrimaryDown_Func($iCtrlID)
	_WinAPI_RedrawWindow(GUICtrlGetHandle($iCtrlID))
	...
EndFunc

...
 
Верх