Что нового

Соединение 2х окон при перемещении

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Версия AutoIt: 3.

Описание: Здравствуйте,помогите реализовать соединение 2х окон при перемещении

Пример:
Код:
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>

$GUITrans = GUICreate("Test", 330, 260, -1, -1,$WS_POPUP)
GUISetBkColor(0x000000)
GUICtrlSetState(-1,$GUI_DISABLE)
_corners(0,0,20,20)
GUICtrlCreateLabel("",0,0,330,40,$WS_CLIPSIBLINGS,$GUI_WS_EX_PARENTDRAG)
GUISetState(@SW_SHOW)

$GUI = GUICreate("", 300, 200, -1, @DesktopHeight /2 - 103, $WS_POPUP, -1, $GUITrans)
$close = GUICtrlCreateButton("close",30,40,80,20)
GUISetState(@SW_SHOW)
WinSetTrans($GUITrans,"",180)

While 1
$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE,$close
			Exit
	EndSwitch			
WEnd

Func _corners($x1,$y1,$x2,$y2)
$pos = WinGetPos($GUITrans)
$ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", $x1, "long", $y1, "long", $pos[2], "long", $pos[3], "long",$x2, "long", $y2)
If $ret[0] Then
	$ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $GUITrans, "long", $ret[0], "int", 1)
	If $ret2[0] Then
		Return 1
	Else
		Return 0
	EndIf	
EndIf
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Вот что получилось:
Код:
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>

Global $mainGUI = 0

$GUITrans = GUICreate("Test", 330, 260, -1, -1,$WS_POPUP)
GUISetBkColor(0x000000)
GUICtrlSetState(-1,$GUI_DISABLE)
_corners(0,0,20,20)
GUIRegisterMsg($WM_ACTIVATE, 'WM_ACTIVATE')
GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
GUICtrlCreateLabel("",0,0,330,40,$WS_CLIPSIBLINGS,$GUI_WS_EX_PARENTDRAG)
GUISetState(@SW_SHOW)

$mainGUI = GUICreate("", 300, 200, -1, @DesktopHeight /2 - 103, $WS_POPUP, -1, $GUITrans)
_corners(0,0,20,20)
$close = GUICtrlCreateButton("close",30,40,80,20)
GUISetState(@SW_SHOW)
WinSetTrans($GUITrans,"",180)

While 1
$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE,$close
			Exit
	EndSwitch			
WEnd

Func _corners($x1,$y1,$x2,$y2)
$pos = WinGetPos($GUITrans)
$ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", $x1, "long", $y1, "long", $pos[2], "long", $pos[3], "long",$x2, "long", $y2)
If $ret[0] Then
	$ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $GUITrans, "long", $ret[0], "int", 1)
	If $ret2[0] Then
		Return 1
	Else
		Return 0
	EndIf	
EndIf
EndFunc

Func WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
    Switch BitAND($wParam, 0xFFFF)
        Case 1, 2
            Switch $hWnd
                Case $GUITrans
                    If BitAND(WinGetState($mainGUI), 2) = 2 Then
                        WinSetOnTop($mainGUI, '', 1)
                        WinSetOnTop($mainGUI, '', 0)
                    EndIf
                Case $mainGUI
                    WinSetOnTop($GUITrans, '', 1)
                    WinSetOnTop($GUITrans, '', 0)
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc

Func WM_MOVE($hWndGUI)
    Local $aParentPos = WinGetPos($GUITrans), $aChildPos = WinGetPos($mainGUI)
    
    If $hWndGUI = $GUITrans Then
        WinMove($mainGUI, "", $aParentPos[0] + 15, $aParentPos[1] + 44)
    EndIf
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Неплохо!
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
А вот с использованием графики (в прикреплённом файле)
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Есть ещё один вопрос,почему на скриншоте нет прозрачного окна,это нормально?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Sergey2210 сказал(а):
Есть ещё один вопрос,почему на скриншоте нет прозрачного окна,это нормально?
Нормально. Делай скриншот с помощью "PrintScreen". А сам пример я бы сделал так (углы сглаженные):

Код:
#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

_GDIPlus_Startup()
$hPng = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\child.png')
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)
_GDIPlus_BitmapDispose($hPng)
_GDIPlus_ShutDown()

$hTrans = GUICreate('', 330, 260, 500, 500, $WS_POPUP, $WS_EX_LAYERED)
$hForm = GUICreate('', 300, 200, 500 + 15, 500 + 45, $WS_POPUP, -1, $hTrans)
GUICtrlCreatePic(@ScriptDir & '\main.jpg', 0, 0, 300, 200)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateButton('Exit', 115, 165, 70, 21)

GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUIRegisterMsg($WM_MOVE, 'WM_MOVE')

_WinAPI_UpdateLayeredWindowEx($hTrans, -1, -1, $hBitmap, 192)

GUISetState(@SW_SHOW, $hTrans)
GUISetState(@SW_SHOW, $hForm)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hTrans

			Local $Pos = WinGetPos($hTrans)

			If IsArray($Pos) Then
				WinMove($hForm, '', $Pos[0] + 15, $Pos[1] + 45)
			EndIf
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
	Switch $hWnd
		Case $hTrans
			Switch $iMsg
				Case $WM_NCHITTEST
					Return $HTCAPTION
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Всё ясно,большоё спасибо,больше вопросов нет :smile:
 
Верх