Das "Verstecken" der Gui lässt sich mit _WinAPI_CombineRgn durchführen. Das ist alles etwas sperrig und deshalb habe ich das mal in eine UDF verpackt.
Mit Aufruf der Funktion _GuiBGInvisible wird eine Ctrl-ID oder ein Array von IDs übergeben. Diese Ctrl werden dann ohne Gui - also frei schwebend - angezeigt.
Optional kann eine Funktion übergeben werden, die anhand der ID das entsprechende Ctrl von der Anzeige ausschließt. Die Funktion muss als einzigen Parameter die $ID führen und True/False (ni. anzeigen / anzeigen) zurück geben.
AutoIt: GuiBGInvisible.au3
;-- TIME_STAMP 2022-07-26 14:55:41 v 0.1
#include-once
#include <WinAPIGdi.au3>
#include <WinAPIHObj.au3>
#include <WinAPISysInternals.au3>
#include <WindowsConstants.au3>
; #FUNCTION# =======================================================================================
; Name ..........: _GuiBGInvisible
; Description ...: Makes the entire window area invisible, only the passed control is displayed.
; Parameter(s)...: $_hGui The Gui handle
; ...............: $_vCtrlAdd One or an array of control IDs
; ....[optional].: $_fCondIgnoreCtrl Function to exclude controls from display based on the passed ID.
; ...............: "MyFunc_Exclude($ID)" must return true/false. (Default: Null, no func)
; Return values .: None
; Author ........: BugFix
; ==================================================================================================
Func _GuiBGInvisible($_hGui, $_vCtrlAdd, $_fCondIgnoreCtrl=Null)
Local $aWin = WinGetPos($_hGui)
Local $combined_rgn = _WinAPI_CreateRectRgn($aWin[0], $aWin[1], $aWin[0]+$aWin[2], $aWin[1]+$aWin[3])
_AddCtrlRegion($combined_rgn, $_vCtrlAdd, $_fCondIgnoreCtrl)
_WinAPI_SetWindowRgn($_hGui, $combined_rgn)
_WinAPI_DeleteObject($combined_rgn)
EndFunc ;==>_GuiBGInvisible
Func _AddCtrlRegion($_full_rgn, $_vCtrlID, $_fCondIgnoreCtrl=Null)
Local $iHtit = _WinAPI_GetSystemMetrics($SM_CYCAPTION)
Local $iFrame = _WinAPI_GetSystemMetrics($SM_CXDLGFRAME)
Local $ctrl_pos, $ctrl_rgn
Local $hParent = Null, $iStyle = Null
If IsArray($_vCtrlID) Then
For $i = 0 To UBound($_vCtrlID) -1
If $hParent = Null Then $hParent = _WinAPI_GetParent(GUICtrlGetHandle($_vCtrlID[$i]))
If $iStyle = Null Then $iStyle = _WinAPI_GetWindowLong($hParent, $GWL_STYLE)
If IsFunc($_fCondIgnoreCtrl) Then
If $_fCondIgnoreCtrl($_vCtrlID[$i]) Then ContinueLoop
EndIf
$ctrl_pos = ControlGetPos($hParent, "", $_vCtrlID[$i])
If __GuiHasCaptionbar($hParent) Then
$ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0]+$iFrame, $ctrl_pos[1]+$iHtit+$iFrame, $ctrl_pos[0] + $ctrl_pos[2]+$iFrame, $ctrl_pos[1] + $ctrl_pos[3]+$iHtit+$iFrame)
Else
$ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
EndIf
_WinAPI_CombineRgn($_full_rgn, $_full_rgn, $ctrl_rgn, $RGN_OR)
_WinAPI_DeleteObject($ctrl_rgn)
Next
Else
If IsFunc($_fCondIgnoreCtrl) Then
If $_fCondIgnoreCtrl($_vCtrlID) Then Return
EndIf
$hParent = _WinAPI_GetParent(GUICtrlGetHandle($_vCtrlID))
$iStyle = _WinAPI_GetWindowLong($hParent, $GWL_STYLE)
$ctrl_pos = ControlGetPos($hParent, "", $_vCtrlID)
If __GuiHasCaptionbar($hParent) Then
$ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0]+$iFrame, $ctrl_pos[1]+$iHtit+$iFrame, $ctrl_pos[0] + $ctrl_pos[2]+$iFrame, $ctrl_pos[1] + $ctrl_pos[3]+$iHtit+$iFrame)
Else
$ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
EndIf
_WinAPI_CombineRgn($_full_rgn, $_full_rgn, $ctrl_rgn, $RGN_OR)
_WinAPI_DeleteObject($ctrl_rgn)
EndIf
EndFunc ;==>_AddCtrlRegion
Func __GuiHasCaptionbar($_hGui)
Local $iStyle = _WinAPI_GetWindowLong($_hGui, $GWL_STYLE)
Select
Case BitAND($iStyle, $WS_CAPTION) = $WS_CAPTION
Return True
Case BitAND($iStyle, $WS_MAXIMIZEBOX) = $WS_MAXIMIZEBOX
Return True
Case BitAND($iStyle, $WS_MINIMIZEBOX) = $WS_MINIMIZEBOX
Return True
Case BitAND($iStyle, $WS_POPUPWINDOW) = $WS_POPUPWINDOW
Return False
Case BitAND($iStyle, $WS_BORDER) = $WS_BORDER
Return False
Case BitAND($iStyle, $WS_POPUP) = $WS_POPUP
Return False
EndSelect
EndFunc ;==>__GuiHasCaptionbar
Alles anzeigen
AutoIt: GuiBGInvisible_Example.au3
;-- TIME_STAMP 2022-07-26 15:17:29
#include "GuiBGInvisible.au3"
#cs
Gui unsichtbar, nur übergebene Control anzeigen.
Ggf. Control durch Exclude-Funktion ignorieren (nicht anzeigen).
#ce
_Example1()
_Example2()
_Example3()
Func _Example1()
Local $aCtrl[5]
Local $GUI = GUICreate('Test', 400, 300)
For $i = 0 To 4
$aCtrl[$i] = GUICtrlCreateButton('Button ' & $i+1, 10, 10+$i*30, 100, 20)
Next
_GuiBGInvisible($GUI, $aCtrl)
GUISetState()
While True
Switch GUIGetMsg()
Case $aCtrl[0] ; nur noch Button2 sichtbar
_GuiBGInvisible($GUI, $aCtrl[1])
Case $aCtrl[1] ; alle Button wieder sichtbar
_GuiBGInvisible($GUI, $aCtrl)
Case $aCtrl[2], $aCtrl[3], $aCtrl[4]
Return GUIDelete($GUI)
EndSwitch
WEnd
EndFunc
Func _Example2()
Local $aCtrl[5]
Local $GUI = GUICreate('Test', 400, 300, -1, -1, $WS_POPUP)
For $i = 0 To 4
$aCtrl[$i] = GUICtrlCreateButton('Button ' & $i+1, 10, 10+$i*30, 100, 20)
Next
_GuiBGInvisible($GUI, $aCtrl)
GUISetState()
While True
Switch GUIGetMsg()
Case $aCtrl[0], $aCtrl[1], $aCtrl[2], $aCtrl[3], $aCtrl[4]
Return GUIDelete($GUI)
EndSwitch
WEnd
EndFunc
Func _Example3()
Local $aCtrl[5]
Local $GUI = GUICreate('Test', 400, 300, -1, -1, BitOR($WS_CAPTION,$WS_POPUPWINDOW))
For $i = 0 To 4
$aCtrl[$i] = GUICtrlCreateButton('Button ' & $i+1, 10, 10+$i*30, 100, 20)
Next
_GuiBGInvisible($GUI, $aCtrl, _Exclude) ; "Button 2 & 4" nicht anzeigen
GUISetState()
While True
Switch GUIGetMsg()
Case $aCtrl[0], $aCtrl[1], $aCtrl[2], $aCtrl[3], $aCtrl[4]
Return GUIDelete($GUI)
EndSwitch
WEnd
EndFunc
Func _Exclude($ID)
Return (StringRegExp(GUICtrlRead($ID), '2|4') <> 0)
EndFunc ;==>_Ignore
Alles anzeigen