Hello all, I have two windows my script creates but I would like to always keep the second window inside the first. I am able to bring it back down if it goes too far up, and back right if it goes too far left, but I'm stumpped on how to bring it up if its too far down and left if it's too far right, I've spent the better part of a half an hour trying different calculations but I just can't seem to get it to position itself back to the right place, and if the child window goes in the bottom left corner it glitched back and fourth between the bottom and left side of the gui.
I know there has to be an easier way to do it, I've seen it in the past. Anyways here's my (faulty) code.
#include <File.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
;~ #include "_GUIResourcePic.au3"
#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>
Global $sFile, $label1
_GDIPlus_Startup()
; Make GUI
Global $hGuix = GUICreate("Secure Instant Messenger - Login - BETA", 720, 405)
Global $iCtrlID = GUICtrlCreatePic("", 0, 0, 720, 405, -1, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetState(-1, $GUI_DISABLE)
;~ _GUICtrlPic_SetImage($iCtrlID, "", True)
GUISetState()
$mainpos = WinGetPos("Secure Instant Messenger - Login - BETA")
DisplayImage
(@ScriptDir
&"\loginform.png", $mainpos[0]+30, $mainpos[1]+ 270)
Global $iPlay = 1
;~ $Label1 = GUICtrlCreateLabel("Version 0.1.0.0", 152, 64, 139, 19)
;~ GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
; Loop till end
While 1
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
if WinExists(@ScriptDir
&"\loginform.png") Then
$mainpos = WinGetPos("Secure Instant Messenger - Login - BETA")
$loginpos = WinGetPos(@ScriptDir
&"\loginform.png")
if $loginpos[0] < $mainpos[0] Then
WinMove(@ScriptDir
&"\loginform.png", "", $mainpos[0]+5, $loginpos[1])
EndIf
if $loginpos[1] < $mainpos[1] Then
WinMove(@ScriptDir
&"\loginform.png", "", $loginpos[0], $mainpos[1]+40)
EndIf
if $loginpos[0]+$loginpos[2] > $mainpos[2]+$mainpos[0] Then
WinMove(@ScriptDir
&"\loginform.png", "", $loginpos[0]-$loginpos[3]+50, $loginpos[0]+$loginpos[2])
EndIf
if $loginpos[1]+$loginpos[3] > $mainpos[3]+$mainpos[1] Then
WinMove(@ScriptDir
&"\loginform.png", "",($mainpos[3]+$mainpos[1])-(($mainpos[3]+$mainpos[1])-$loginpos[0]), ($mainpos[2]+$mainpos[0])-$loginpos[1] )
EndIf
EndIf
WEnd
Func DisplayImage
($sFile, $iPosX = -1, $iPosY = -1, $iAlpha = 0xFF, $bTopmost = True)
Local Const $hBmp_Background = _GDIPlus_BitmapCreateFromFile($sFile) ;load the image
If @error Then Return SetError(1, 0, 0) ;image cannot be loaded
Local Const $iW = _GDIPlus_ImageGetWidth($hBmp_Background), $iH = _GDIPlus_ImageGetHeight($hBmp_Background) ;get the dimension of the background image
Local Const $hGUI = GUICreate($sfile, $iW, $iH, $iPosX, $iPosY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST * $bTopmost, $WS_EX_TOOLWINDOW),$hguix) ;create GUI with appropriate styles and extented style (borderless transparent GUI)
GUICtrlCreateLabel("", 0, 0, $iW, $iH, Default, $GUI_WS_EX_PARENTDRAG) ;create a hidden label for GUI dragging
GUISetState(@SW_SHOW, $hGUI) ;show GUI
Local Const $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) ;define an empty bitmap where all the gfx stuff will copied to
Local Const $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap) ;get the context to the bitmap to be able to copy / draw to the bitmap
_GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp_Background, 0, 0, $iW, $iH) ;draw background image to the empty bitmap
;display GDI+ with transparency on desktop
Local Const $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap) ;convert GDI+ image to GDI to display it on the screen using GDI functions
Local Const $hScrDC = _WinAPI_GetDC($hGUI) ;get the device context (dc) handle of the GUI
Local Const $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC) ;create a compatible dc handle
Local Const $hOld = _WinAPI_SelectObject($hMemDC, $hHBitmap) ;selects the GDI bitmap object into the specified device context
Local Const $tSize = DllStructCreate($tagSIZE) ;create a $tagSIZE struct (x = width, y = height)
DllStructSetData($tSize, "X", $iW) ;set data for width
DllStructSetData($tSize, "Y", $iH) ;set data for height
Local $tSource = DllStructCreate($tagPOINT) ;create a $tagPOINT struct (x = x position, y = y position)
Local $tBlend = DllStructCreate($tagBLENDFUNCTION) ;create $tagBLENDFUNCTION struct -> see help file for more info
DllStructSetData($tBlend, "Alpha", $iAlpha) ;set the alpha channel of the GUI -> 255 = opaque, 0 = transparent
DllStructSetData($tBlend, "Format", 1) ;set the format to 1 -> bitmap has alpha channels
DllCall("user32.dll", "bool", "UpdateLayeredWindow", "hwnd", $hGUI, "handle", $hScrDC, "ptr", 0, "struct*", $tSize, "handle", $hMemDC, "struct*", $tSource, "dword", 0, "struct*", $tBlend, "dword", $ULW_ALPHA) ;display bitmap on screen
;release resources otherwise memory will filled up (memory leak)
_GDIPlus_GraphicsDispose($hGfx)
_GDIPlus_BitmapDispose($hBitmap)
Local $aResource[7] = [$hGUI, $hScrDC, $hHBitmap, $hMemDC, $tBlend, $tSize, $tSource] ;return the handle to release it later
Return $aResource
EndFunc ;==>DisplayImage
; This function releases the resources of a specific image and closes it
Func ReleaseResources
(ByRef $aResource)
If Not IsArray($aResource) Then Return SetError(1, 0, 0)
If UBound($aResource) <> 7 Then Return SetError(2, 0, 0)
_WinAPI_ReleaseDC($aResource[0], $aResource[1])
_WinAPI_DeleteDC($aResource[3])
_WinAPI_DeleteObject($aResource[2])
GUIDelete($aResource[0])
EndFunc ;==>ReleaseResources
; To fade in an image leave $bIn at default (True); to fade out specify False.
; There are also options to set the ending transparency level (0 transparent, 255 opaque), speed and delay.
; If you change the speed or delay be sure to specify $bIn and $iTrans, otherwise you'll wonder why the fade-in or out isn't what you hoped for.
; The default values are specified in the function below.
Func _Fader
($res1, $bIn = True, $iTrans = 255, $speed = 3, $delay = 10 )
If Not IsArray($res1) Then Return SetError(1, 0, 0)
If UBound($res1) <> 7 Then Return SetError(2, 0, 0)
Switch $bIn
Case True
For $a = 0 To $iTrans Step $speed
DllStructSetData($res1[4], "Alpha", $a)
DllCall("user32.dll", "bool", "UpdateLayeredWindow", "hwnd", $res1[0], "handle", $res1[1], "ptr", 0, "struct*", $res1[5], "handle", $res1[3], "struct*", $res1[6], "dword", 0, "struct*", $res1[4], "dword", $ULW_ALPHA) ;display bitmap on screen
Sleep($delay)
Next
Case Else
For $a = $iTrans To 0 Step -$speed
DllStructSetData($res1[4], "Alpha", $a)
DllCall("user32.dll", "bool", "UpdateLayeredWindow", "hwnd", $res1[0], "handle", $res1[1], "ptr", 0, "struct*", $res1[5], "handle", $res1[3], "struct*", $res1[6], "dword", 0, "struct*", $res1[4], "dword", $ULW_ALPHA) ;display bitmap on screen
Sleep($delay)
Next
EndSwitch
EndFunc ;==>_FadeIn