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.
AutoIt
#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
required image is attached