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

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
Avatar du membre
Anthony
Niveau 6
Niveau 6
Messages : 292
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

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

#1

Message 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
Modifié en dernier par Anthony le lun. 06 avr. 2020 16:02, modifié 2 fois.
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.

Mon UDF GuiStatusBar facile
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

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

#2

Message 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
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#3

Message 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


 
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Anthony
Niveau 6
Niveau 6
Messages : 292
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

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

#4

Message 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:
Modifié en dernier par Anthony le lun. 06 avr. 2020 16:00, modifié 1 fois.
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.

Mon UDF GuiStatusBar facile
Avatar du membre
Anthony
Niveau 6
Niveau 6
Messages : 292
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

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

#5

Message 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)
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.

Mon UDF GuiStatusBar facile
Répondre