Viktor1703
AutoIT Гуру
- Сообщения
- 1,535
- Репутация
- 413
Плюс заключается в том что даже если элемент на окне отключен то за него можно тащить окно.
Применение например в скиновых окнах, ставим на какую нибудь картинку и можно будет тащить окно, даже если состояние картинки Disable
Example.au3:
Parentdrag.au3:
Применение например в скиновых окнах, ставим на какую нибудь картинку и можно будет тащить окно, даже если состояние картинки Disable
Example.au3:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Parentdrag.au3>
$hForm = GUICreate("", 200, 100, -1, -1, $WS_POPUP)
$hParent1 = GUICtrlCreateLabel("", 0, 0, 200, 20)
GUICtrlSetBkColor($hParent1, 0x000000)
GUICtrlSetState($hParent1, $GUI_DISABLE)
$hParent2 = GUICtrlCreateLabel("", 0, 80, 200, 20)
GUICtrlSetBkColor($hParent2, 0x000000)
GUICtrlSetState($hParent2, $GUI_DISABLE)
GUISetState()
While 1
GUICtrlSetParentdrag($hForm, $hParent1)
GUICtrlSetParentdrag($hForm, $hParent2)
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $hParent1
ConsoleWrite("$hParent1" & @CRLF)
Case $hParent2
ConsoleWrite("$hParent2" & @CRLF)
EndSwitch
WEnd
Parentdrag.au3:
Код:
#Include-once
If Not IsDeclared("WM_SYSCOMMAND") Then Global Const $WM_SYSCOMMAND = 0x0112
If Not IsDeclared("WM_PARENTDRAG") Then Global Const $WM_PARENTDRAG = 0xF009
If Not IsDeclared("WM_COMMAND") Then Global Const $WM_COMMAND = 0x0111
Global $iSwitch_Param[1][2] = [[0, 0]]
Func GUICtrlSetParentdrag($hWnd, $CtrlId)
$iSwitch_Param[0][0] += 1
ReDim $iSwitch_Param[$iSwitch_Param[0][0] + 1][UBound($iSwitch_Param, 2)]
$iSwitch_Param[$iSwitch_Param[0][0]][0] = $CtrlId
$iSwitch_Param[$iSwitch_Param[0][0]][1] = 1
Local $hInfo = GUIGetCursorInfo($hWnd)
If Not @error Then
If $hInfo[2] Then
If __GetSwitch($CtrlId) Then
If $hInfo[4] = $CtrlId Then
__SetSwitch($CtrlId, $hInfo[4])
Else
__SetSwitch($CtrlId, 0)
EndIf
EndIf
If __GetSwitch($CtrlId) = $CtrlId Then
DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", $WM_SYSCOMMAND, "int", $WM_PARENTDRAG, "int", 0)
Local $hWndParent = DllCall("user32.dll", "hwnd", "GetParent", "hwnd", GUICtrlGetHandle($CtrlId))
If Not @error Then
DllCall("user32.dll", "bool", "PostMessage", "hwnd", $hWndParent[0], "uint", $WM_COMMAND, "wparam", $CtrlId, "lparam", GUICtrlGetHandle($CtrlId))
EndIf
EndIf
Else
__SetSwitch($CtrlId, 1)
EndIf
EndIf
EndFunc
Func __GetSwitch($CtrlID)
For $i = 1 To $iSwitch_Param[0][0]
If $iSwitch_Param[$i][0] = $CtrlID Then
Return $iSwitch_Param[$i][1]
EndIf
Next
EndFunc
Func __SetSwitch($CtrlID, $Param)
For $i = 1 To $iSwitch_Param[0][0]
If $iSwitch_Param[$i][0] = $CtrlID Then
$iSwitch_Param[$i][1] = $Param
EndIf
Next
EndFunc