Bei Win 11 kann ich mit Maus über Max-Button auf dem aufpoppenden Fenster auswählen, wie der Bildschirm geteilt wird und welche Position mein Fenster dann einnimmt. Das ist grundsätzlich erst mal schön.
Mein Problem:
Wie hier erwähnt, schreibe ich ein AddOn zur Nutzung von Git in SciTE. Unter anderem habe ich in die SciTE-Toolbar Icons integriert zur Anzeige von Status und Anzahl von untracked files (oder modified).
Sieht dann so aus
kein Repo vorhanden Repo ist aktuell Repo - 7 Dateien untracked Repo - >9 Dateien untracked
Ich zeichne die Icon mit WinAPI-Funktionen in die Toolbar. Bei Neuzeichnen des SciTE-Fensters geht das natürlich verloren und muss ebenfalls neu gezeichnet werden.
Das kann ich grundsätzlich prima abfangen, indem ich einen Größenvergleich (pos/size) des Fensters durchführe und bei Änderung neu zeichne. Fenster verschieben / Größe ändern / Minimieren / Maximieren - alles führt zur Änderung bei WinGetPos.
Nur halt die Größenänderung über den Max-Button, wie anfangs beschrieben. ändert die auf diese Weise abgefragte Fenstergröße nicht.
Habt ihr eine Idee?
Hier mein Skript ( P.S. - Das Skript muss von Hand abgeschossen werden, ist zum Dauerlauf gedacht )
#include <GuiToolbar.au3>
#include <WinAPIShellEx.au3>
;---------------------------------------------------------------------------------------------------
Global $ICO = @ScriptDir & '\ico\'
Global $mIcon[]
$mIcon['IsRepo'] = $ICO & 'git_hasrepo.ico'
$mIcon['NoRepo'] = $ICO & 'git_norepo.ico'
$mIcon['Changing'] = $ICO & 'git_repo-w-changings.ico'
For $i = 1 To 9
$mIcon[$i] = $ICO & $i & '_16.ico'
Next
$mIcon[99] = $ICO & '9+_16.ico' ; >9 files
;---------------------------------------------------------------------------------------------------
Global $gm_SciTE[]
$gm_SciTE.hWnd = 0
$gm_SciTE.ExistsLast = 0
$gm_SciTE.ExistsCurr = 0
$gm_SciTE.WinArrayLast = 0
$gm_SciTE.WinArrayCurr = 0
$gm_SciTE.bReDraw = False
$gm_SciTE.aStatusIcon = 0
$gm_SciTE.aCounterIcon = 0
$gm_SciTE.StatusIcon = Null
$gm_SciTE.CounterIcon = Null
;---------------------------------------------------------------------------------------------------
_SciTEToolBar_DrawIconGitStatus('Changing')
_SciTEToolBar_DrawIconGitCounter(99)
;---------------------------------------------------------------------------------------------------
_CheckSciTE()
AdlibRegister(_CheckSciTE, 1000)
While True
Sleep(5000)
WEnd
Func _End()
AdlibUnRegister(_CheckSciTE)
Exit
EndFunc
Func _CheckSciTE()
If ProcessExists("SciTE.exe") Then
Local $hScite, $hToolbar, $hStatusbar
_GetSciTEhWnd($hScite, $hToolbar, $hStatusbar)
$gm_SciTE.ExistsCurr = 1
If $gm_SciTE.ExistsLast = 0 Then
$gm_SciTE.ExistsLast = 1
$gm_SciTE.hWnd = $hScite
AdlibRegister(_CheckReDraw, 350)
EndIf
Else
$gm_SciTE.ExistsCurr = 0
If $gm_SciTE.ExistsLast = 1 Then
$gm_SciTE.ExistsLast = 0
$gm_SciTE.hWnd = 0
AdlibUnRegister(_CheckReDraw)
EndIf
EndIf
EndFunc
Func _CheckReDraw()
; check if size/pos has changed (after min/max the pos has also changed)
$gm_SciTE.WinArrayCurr = WinGetPos($gm_SciTE.hWnd)
Local $bChanged = False
If IsArray($gm_SciTE.WinArrayLast) Then
$bChanged = _WinSizeDiff() ; if Diff returns: True
Else
$bChanged = True
EndIf
$gm_SciTE.bReDraw = $bChanged
_ReDraw()
EndFunc
Func _WinSizeDiff()
If ($gm_SciTE.WinArrayLast[0] <> $gm_SciTE.WinArrayCurr[0]) Or _
($gm_SciTE.WinArrayLast[1] <> $gm_SciTE.WinArrayCurr[1]) Or _
($gm_SciTE.WinArrayLast[2] <> $gm_SciTE.WinArrayCurr[2]) Or _
($gm_SciTE.WinArrayLast[3] <> $gm_SciTE.WinArrayCurr[3]) Then
Return True
Else
Return False
EndIf
EndFunc
Func _ReDraw()
If Not $gm_SciTE.bReDraw Then
Return
Else
AdlibUnRegister(_CheckReDraw)
_SciTEToolBar_DrawIconGitStatus($gm_SciTE.StatusIcon)
_SciTEToolBar_DrawIconGitCounter($gm_SciTE.CounterIcon)
$gm_SciTE.WinArrayLast = $gm_SciTE.WinArrayCurr
AdlibRegister(_CheckReDraw, 350)
EndIf
EndFunc
Func _SciTEToolBar_DrawIconGitStatus($_sStatus) ; 'IsRepo', 'NoRepo', 'Changing'
$gm_SciTE.aStatusIcon = _SciTEToolBar_DrawIcon($mIcon[$_sStatus], True)
$gm_SciTE.StatusIcon = $_sStatus
EndFunc
Func _SciTEToolBar_DrawIconGitCounter($_iCounter) ; 1,2,3,4,5,6,7,8,9,99 0-Deletes the counter Icon
If $_iCounter = 0 Then
_SciTEToolBar_DeleteDrawedIcon($gm_SciTE.aCounterIcon)
$gm_SciTE.aCounterIcon = 0
$gm_SciTE.CounterIcon = Null
ElseIf $_iCounter = Null Then
Return
Else
$gm_SciTE.aCounterIcon = _SciTEToolBar_DrawIcon($mIcon[$_iCounter], True, 16)
$gm_SciTE.CounterIcon = $_iCounter
EndIf
EndFunc
Func _SciTEToolBar_DrawIcon($_sPathIcon, $_bDeleteBG=True, $_xRel2LastTBItem=Null)
Local $hScite, $hToolbar, $hStatusbar ; get SciTE handles
_GetSciTEhWnd($hScite, $hToolbar, $hStatusbar)
If @error Then Return SetError(1)
Local $aPadding = _GUICtrlToolbar_GetPadding($hToolbar)
Local $xPad = $aPadding[0]
Local $aLastItem = _GUICtrlToolbar_GetButtonRect($hToolbar, _
_GUICtrlToolbar_IndexToCommand($hToolbar, _GUICtrlToolbar_ButtonCount($hToolbar)-1))
Local $x = $_xRel2LastTBItem = Null ? $aLastItem[2] : ($aLastItem[2] + $xPad + $_xRel2LastTBItem)
Local $hDC = _WinAPI_GetDC($hToolbar)
If $_bDeleteBG Then ; Delete last icon by overwriting
Local $a[] = [$x+$xPad, 3, 16, 16]
_SciTEToolBar_DeleteDrawedIcon($a, $hDC)
EndIf
Local $hIcon = _WinAPI_ShellExtractIcon($_sPathIcon, 0, 16, 16)
Local $aIconDrawed[] = [$x+$xPad, 3, 16, 16]
_WinAPI_DrawIconEx($hDC, $x+$xPad, 3, $hIcon, 16, 16)
_WinAPI_DestroyIcon($hIcon)
_WinAPI_DeleteDC($hDC)
Return $aIconDrawed
EndFunc
Func _SciTEToolBar_DeleteDrawedIcon($_aIcon, $_hDC=Null) ; $_aIcon returned from _SciTEToolBar_DrawIcon
Local $tRect = DllStructCreate($tagRect), $bDelDC = False
$tRect.Left = $_aIcon[0]
$tRect.Top = $_aIcon[1]
$tRect.Right = $_aIcon[0] + $_aIcon[2]
$tRect.Bottom = $_aIcon[1] + $_aIcon[3]
If $_hDC = Null Then
Local $hScite, $hToolbar, $hStatusbar ; get SciTE handles
_GetSciTEhWnd($hScite, $hToolbar, $hStatusbar)
If @error Then Return SetError(1)
$_hDC = _WinAPI_GetDC($hToolbar)
$bDelDC = True
EndIf
Local $hBrush = _WinAPI_CreateSolidBrush(0xF0F0F0)
_WinAPI_FillRect($_hDC, $tRect, $hBrush)
_WinAPI_DeleteObject($hBrush)
If $bDelDC Then _WinAPI_DeleteDC($_hDC)
EndFunc
Func _GetSciTEhWnd(ByRef $_hScite, ByRef $_hToolbar, ByRef $_hStatusbar)
$hActive = WinGetHandle('[ACTIVE]')
$aResult = DllCall('user32.dll', "int", "GetClassNameW", "hwnd", $hActive, "wstr", "", "int", 4096)
If Not @error And $aResult[2] = 'SciTEWindow' Then
$_hScite = $hActive
$_hToolbar = ControlGetHandle($_hScite, '', '[CLASS:ToolbarWindow32; INSTANCE:1]')
$_hStatusbar = ControlGetHandle($_hScite, '', '[CLASS:msctls_statusbar32; INSTANCE:1]')
Return 1
Else
Return SetError(1)
EndIf
EndFunc
Alles anzeigen