Page 1 sur 1

[R] Bouton dans une StatusBar avec Gui $WS_SIZEBOX (Lien vers UDF)

Posté : ven. 03 avr. 2020 02:04
par Anthony
Bonjour à tous,

Je viens vers vous pour m'aider à optimiser ma StatusBar.
Je souhaiterai caresser l’espoir de pouvoir redimensionner ($WS_SIZEBOX) ma Gui proprement et avec fluidité (GUIRegisterMsg)
Malheureusement je n'y arrive pas et c'est pas faute d'avoir cherché sur la toile, je n'ai rien trouvé (de fonctionnel).
Je sais que çà se joue à pas grand chose mais là je sèche :roll:
Pouvez-vous m'aider, merci.

  • Code : Tout sélectionner

    #include <GuiConstantsEx.au3>
    #include <GuiStatusBar.au3>
    #include <WindowsConstants.au3>
    #include <ProgressConstants.au3>
    
    Global $hStatus, $hProgress, $hProgress2, $hGUI, $progress, $progress2, $fSize = False
    
    _Main()
    
    Func _Main()
    
    	Local $hInput, $input
    	Local $aParts[4] = [80, 160, 300, -1]
    
    	; Create GUI
    	$hGUI = GUICreate("StatusBar Embed Control", 400, 300)
    	GUISetStyle(BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU))
    
    	$hStatus = _GUICtrlStatusBar_Create($hGUI)
    	_GUICtrlStatusBar_SetMinHeight($hStatus, 20)
    	_GUICtrlStatusBar_SetParts($hStatus, $aParts)
    	_GUICtrlStatusBar_SetText($hStatus, "Part 1")
    	_GUICtrlStatusBar_SetText($hStatus, "Part 2", 1)
    
    	; Embed a progress bar
    	$progress = GUICtrlCreateProgress(10, 10, 100, 15, $PBS_SMOOTH)
    	$hProgress = GUICtrlGetHandle($progress)
    	_GUICtrlStatusBar_EmbedControl($hStatus, 2, $hProgress)
    
    ;~ 	; *** Warning *** Resizing the window with the following enabled will hard crash AutoIt.
    	$progress2 = GUICtrlCreateButton( "Encoder", 0, 0, -1, -1)
    ;~ 	$progress2 = GUICtrlCreateProgress(0, 0, 100, 15, $PBS_MARQUEE)
    	$hProgress2 = GUICtrlGetHandle($progress2)
    	_GUICtrlStatusBar_EmbedControl($hStatus, 3, $hProgress2)
    	_SendMessage($hProgress2, $PBM_SETMARQUEE, True, 200)
    
    	GUIRegisterMsg($WM_SIZE, "WM_SIZE")
    
    	GUISetState()
    
    	Do
    		If $fSize Then
    			_GUICtrlStatusBar_EmbedControl($hStatus, 2, $hProgress)
    			_GUICtrlStatusBar_EmbedControl($hStatus, 3, $hProgress2)
    			$fSize = False
    		EndIf
    
    	Until GUIGetMsg() = $GUI_EVENT_CLOSE
    	GUIDelete()
    EndFunc   ;==>_Main
    
    ; Resize the status bar when GUI size changes
    Func WM_SIZE($hWnd, $iMsg, $iwParam, $ilParam)
    	_GUICtrlStatusBar_Resize($hStatus)
    	$fSize = True
    	GUICtrlSetPos($progress2, -100, -100) ; hide the marquee off the window until the status bar part is big enough to hold it.
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_SIZE

Re: [..] Bouton dans une StatusBar avec Gui $WS_SIZEBOX

Posté : ven. 03 avr. 2020 18:04
par walkson
Bonjour,
C'est un peu du bricolage mais ça marche !
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>

Global $Form1 = GUICreate("", 500, 285)
GUISetStyle(BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU))
Global $StatusBar1 = _GUICtrlStatusBar_Create($Form1)
Global $StatusBar1_PartsWidth[4] = [50, 100,200, -1]
_GUICtrlStatusBar_SetParts($StatusBar1,-1, $StatusBar1_PartsWidth)
_GUICtrlStatusBar_SetText($StatusBar1, "AA", 0)
_GUICtrlStatusBar_SetText($StatusBar1, "BB", 1)
_GUICtrlStatusBar_SetText($StatusBar1, "", 2)
_GUICtrlStatusBar_SetText($StatusBar1, "", 3)
_GUICtrlStatusBar_SetMinHeight($StatusBar1, 20)
Global $Progress1 = GUICtrlCreateProgress(100, 265, 169, 17)
GUICtrlSetResizing(-1,256+512)
_GUICtrlStatusBar_EmbedControl($StatusBar1, 2, $Progress1,2)
Global $Button = GUICtrlCreateButton("Button", 350, 265, 97, 17)
GUICtrlSetResizing(-1,256+512)
GUICtrlSetState($Button,BitOR($GUI_ONTOP,$GUI_FOCUS))
_GUICtrlStatusBar_EmbedControl($StatusBar1, 3, $Button,2)
Global $Button1 = GUICtrlCreateButton("Button1", 24, 128, 97, 33)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_SIZE, "WM_SIZE")
While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
   Exit

    Case $Button1
               For $i = 1 To 100
               GUICtrlSetData($Progress1, $i)
               Sleep(50)
            Next
            GUICtrlSetData($Progress1, 0)
    Case $Button
               For $i = 1 To 100
               GUICtrlSetData($Progress1, $i)
               Sleep(50)
            Next
            GUICtrlSetData($Progress1, 0)
 EndSwitch
WEnd
Func WM_SIZE($hWnd, $iMsg, $iwParam, $ilParam)
   _GUICtrlStatusBar_Resize($StatusBar1)
   Local $aRect3 = _GUICtrlStatusBar_GetRect($StatusBar1,3)
   Local $aRect2 = _GUICtrlStatusBar_GetRect($StatusBar1,2)
   $posA = ControlGetPos($Form1, "","msctls_statusbar321")
   GUICtrlSetPos($Button,$aRect3[0],$posA[1] + 3,97,17)
   GUICtrlSetPos($Progress1,$aRect2[0],$posA[1] + 3,169,17)
   GUICtrlSetState($Button,BitOR($GUI_ONTOP,$GUI_FOCUS))
   Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE
Je ne sais pas si GUICtrlSetState($Button,BitOR($GUI_ONTOP,$GUI_FOCUS)) est correcte mais le principal est de ne pas perdre l'accès au Button
Sinon, pour éviter d'écraser les contrôles en modifiant la taille de la GUI, vous avez cette solution:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $GUIMINWID = 300, $GUIMINHT = 300 ; set your restrictions here
Global $GUIMAXWID = 800, $GUIMAXHT = 800

GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")

$hGUI = GUICreate("Test", 500, 500, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))

GUISetState()

$aPos = WinGetPos($hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_MAXIMIZE
            WinMove($hGUI, "", $aPos[0], $aPos[1], $GUIMAXWID, $GUIMAXHT) ; resets intial size
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func WM_GETMINMAXINFO($hwnd, $Msg, $wParam, $lParam)
    $tagMaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($tagMaxinfo, 7, $GUIMINWID) ; min X
    DllStructSetData($tagMaxinfo, 8, $GUIMINHT) ; min Y
    DllStructSetData($tagMaxinfo, 9, $GUIMAXWID ); max X
    DllStructSetData($tagMaxinfo, 10, $GUIMAXHT ) ; max Y
    Return 0
EndFunc   ;==>WM_GETMINMAXINFO
Vous ne le demandez pas mais ça reste dans le sujet :P

Re: [..] Bouton dans une StatusBar avec Gui $WS_SIZEBOX  

Posté : sam. 04 avr. 2020 09:09
par mikell
Un peu moins approximatif que la solution précédente ... :mrgreen:
Plutôt que donner le focus au bouton, il faut mettre la statusbar en dessous - et enlever le flicker au redimensionnement qui pique les yeux
Le WM_GETMINMAXINFO est une bonne idée

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPISys.au3>
#include <WinAPI.au3>

Global $exstyle

Global $Form1 = GUICreate("", 500, 285)
GUISetStyle(BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU))

Global $StatusBar1 = _GUICtrlStatusBar_Create($Form1)
Global $StatusBar1_PartsWidth[4] = [50, 100, 300, -1]
_GUICtrlStatusBar_SetParts($StatusBar1,-1, $StatusBar1_PartsWidth)
_GUICtrlStatusBar_SetText($StatusBar1, "AA", 0)
_GUICtrlStatusBar_SetText($StatusBar1, "BB", 1)
;_GUICtrlStatusBar_SetText($StatusBar1, "", 2)
;_GUICtrlStatusBar_SetText($StatusBar1, "", 3)
_GUICtrlStatusBar_SetMinHeight($StatusBar1, 20)

Global $Progress1 = GUICtrlCreateProgress(100, 265, 200, 17)
GUICtrlSetResizing(-1,2+256+512)
_GUICtrlStatusBar_EmbedControl($StatusBar1, 2, $Progress1,2)

Global $Button = GUICtrlCreateButton("Button", 310, 265, 97, 17)
GUICtrlSetResizing(-1,256+512)
_GUICtrlStatusBar_EmbedControl($StatusBar1, 3, $Button,2)

Global $Button1 = GUICtrlCreateButton("Button1", 24, 128, 97, 33)

GUISetState(@SW_SHOW)

_WinAPI_SetWindowPos($StatusBar1, $HWND_BOTTOM, 0, 0, 0, 0, BitOR($SWP_FRAMECHANGED, $SWP_NOMOVE, $SWP_NOSIZE, $SWP_NOACTIVATE))


GUIRegisterMsg($WM_SIZE, "WM_SIZE")
GUIRegisterMsg($WM_SYSCOMMAND, "_WM_SYSCOMMAND")  
GUIRegisterMsg($WM_EXITSIZEMOVE, "WM_EXITSIZEMOVE")


While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
        Exit
  Case $Button1
        For $i = 1 To 100
                 GUICtrlSetData($Progress1, $i)
                 Sleep(50)
        Next
        GUICtrlSetData($Progress1, 0)
 Case $Button
       For $i = 1 To 100
                  GUICtrlSetData($Progress1, $i)
                  Sleep(50)
       Next
       GUICtrlSetData($Progress1, 0)
 EndSwitch
WEnd


Func WM_SIZE($hWnd, $iMsg, $iwParam, $ilParam)
       _GUICtrlStatusBar_Resize($StatusBar1)
      ;  Local $aRect3 = _GUICtrlStatusBar_GetRect($StatusBar1,3)
     ;   Local $aRect2 = _GUICtrlStatusBar_GetRect($StatusBar1,2)
     ;   $posA = ControlGetPos($Form1, "","msctls_statusbar321")
     ;   GUICtrlSetPos($Button,$aRect3[0],$posA[1] + 3,97,17)
     ;   GUICtrlSetPos($Progress1,$aRect2[0],$posA[1] + 3,169,17)
     ;   GUICtrlSetState($Button,BitOR($GUI_ONTOP,$GUI_FOCUS))
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE

Func _WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
 #forceref $hWnd, $Msg, $lParam
    Switch BitAND($wParam, 0xFFF0)
   Case 0xF000   ; $SC_SIZE
      $exstyle = _WinAPI_GetWindowLong($Form1, $GWL_EXSTYLE)
      _WinAPI_SetWindowLong($Form1, $GWL_EXSTYLE, $WS_EX_COMPOSITED)
    EndSwitch
EndFunc

Func WM_EXITSIZEMOVE($hWnd, $msg, $wParam, $lParam)
    _WinAPI_SetWindowLong($Form1, $GWL_EXSTYLE, $exstyle )
     Return $GUI_RUNDEFMSG
EndFunc


 

Re: [..] Bouton dans une StatusBar avec Gui $WS_SIZEBOX

Posté : sam. 04 avr. 2020 19:30
par Anthony
Merci à tous les deux,

Je vais regarder çà de plus près dès que j'ai un peu de temps (bientôt).
Pourquoi ne pas en faire un UDF ?
Ça serait génial :?:
Je passe en résolu, merci à tous les deux :wink:

Re: [R] Bouton dans une StatusBar avec Gui $WS_SIZEBOX

Posté : lun. 06 avr. 2020 15:59
par Anthony
Voilà j'ai bossé un peu...
J'ai finalement créé un UDF (c'est un début) mais vous pouvez m'aider à le compléter, autant que çà serve à tous ;)

Voici le lien du topic : [UDF] GuiStatusBar facile (GuiStatusBarEx.au3)