Page 1 sur 1
[R] Redimensionner une GUI "en douceur" et fluide
Posté : dim. 06 juil. 2014 21:53
par yohan8
Hello,
J'essaye de redimensionner une gui de manière fluide et le résultat que j'obtiens n'est pas très satisfaisant (voir FJ).
Si quelqu'un connais une autre méthode plus "jolie" tout en gardant l'effet "redimensionnement progressif" je suis preneur.
EDIT : j'ai rejouté l'include GUICtrlSetOnHover.
Re: [..] Redimensionner une GUI "en douceur" et fluide
Posté : dim. 06 juil. 2014 22:22
par mikell
Tu pourrais essayer _WinAPI_AnimateWindow mais résultat non garanti en cas de gui compliquée
Et aussi mettre l'include dans le pack, c'est mieux pour tester
Re: [..] Redimensionner une GUI "en douceur" et fluide
Posté : lun. 07 juil. 2014 17:16
par yohan8
Il me semble que _WinAPI_AnimateWindow permet effectivement d'avoir un rendu fluide de certains mouvement (hide/déplacement) de la GUI mais pas pour un redimensionnement.
L'autre solution serait de cacher les bordures noir qui apparaisse lors du redimensionnement vers l'inférieur ou alors de supprimer le contour noir qui provoque peut-être ces bordures épaisses.
EDIT
Impossible de modifier le style "avec bordure fine" à "sans bordure".
► Afficher le texte
Code : Tout sélectionner
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 293, 240, 192, 124,BitOR($WS_POPUP,$WS_CLIPSIBLINGS)); BitOR($WS_POPUP,$WS_CLIPSIBLINGS))
GUISetBkColor(0xadFeEB)
$style = GUIGetStyle($Form1)
GUISetState()
Sleep(1000)
GUISetStyle($WS_POPUPWINDOW)
Sleep(1000)
GUISetStyle($style[0],$style[1])
Sleep(1000)
J'en arrive même à des résultats surprenants.
► Afficher le texte
Code : Tout sélectionner
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 293, 240, 192, 124,$WS_POPUPWINDOW)
GUISetBkColor(0xadFeEB)
$style = GUIGetStyle($Form1)
GUISetState()
Sleep(1000)
GUISetStyle(BitOR($WS_POPUPWINDOW, $WS_THICKFRAME))
Sleep(1000)
GUISetStyle($style[0],$style[1])
Sleep(1000)
Après tout comme dit la doc : "It is the designer responsibility to take care of this compatibility". Trad=Fonction dépendant de la chance du designer
Re: [..] Redimensionner une GUI "en douceur" et fluide
Posté : jeu. 04 sept. 2014 20:54
par jguinch
Et du côté de
_WinAPI_SetWindowPos() ?
Code : Tout sélectionner
_WinAPI_SetWindowPos ( $GUI_ID, $HWND_TOP, $Size[0] - $iwidth/2, $Size[1] - $iheight/2, $Size[2] + $iwidth, $Size[3] + $iheight, $SWP_NOREDRAW )
Re: [..] Redimensionner une GUI "en douceur" et fluide
Posté : ven. 05 sept. 2014 16:10
par yohan8
Des résultats surprenant amenant à la résolution de ce topic !
La fonction
_WinAPI_SetWindowPos() permet effectivement de redimensionner et repositionner sa GUI mais j'ai trouvé aucun paramètre permettant de le faire en douceur et fluide.
Je suis donc revenu à mon problème qui était de supprimer les bordures de la gui pour la redimensionner sans qu'il y ait de vilain rectangle gris (couleurs de la bordure $WS_POPUPWINDOW) clignotant. Ce que j'ai trouvé de surprenant c'est que j'étais obligé de coupler la fonction
GUISetStyle (pour supprimer les bordures avec BitOR($WS_POPUP,$WS_CLIPSIBLINGS)) avec
_WinAPI_SetWindowPos(). A contrario la fonction
GUISetStyle seul ou avec
GuiSetState ne s’exécutait pas ou rendait des résultats incohérent (voir post précédent).
Un code fonctionnelle vaut bien mieux que des mots :
Ajuster la valeur de la variable "vitesse" permet de réduire l'effet saccadé.
► Afficher le texte
Code : Tout sélectionner
#include <WinAPI.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 293, 240, 300, 200,$WS_POPUPWINDOW)
GUISetBkColor(0xadFeEB)
GUISetState()
Sleep(1000)
_RedimGUI($Form1,600,600)
Sleep(1000)
Func _RedimGUI($GUI_ID,$NewWidth,$NewHeight)
$Size = WinGetPos($GUI_ID)
$DeltaWidth = $NewWidth - $Size[2]
$DeltaHeight = $NewHeight - $Size[3]
GUISetStyle(BitOR($WS_POPUP,$WS_CLIPSIBLINGS),Default,$GUI_ID)
_WinAPI_SetWindowPos($GUI_ID,$HWND_TOP,$Size[0],$Size[1],$Size[2],$Size[3],$SWP_SHOWWINDOW)
$vitesse = 500
For $i = 0 To $vitesse
$iwidth = $i*($DeltaWidth/$vitesse)
$iheight = $i*($DeltaHeight/$vitesse)
;~ _WinAPI_SetWindowPos($GUI_ID,$HWND_TOP,$Size[0] - $iwidth/2, $Size[1] - $iheight/2, $Size[2] + $iwidth, $Size[3] + $iheight,$SWP_SHOWWINDOW )
WinMove($GUI_ID,Default,$Size[0] - $iwidth/2, $Size[1] - $iheight/2, $Size[2] + $iwidth, $Size[3] + $iheight)
Next
$Size = WinGetPos($GUI_ID)
GUISetStyle($WS_POPUPWINDOW,Default,$GUI_ID)
_WinAPI_SetWindowPos($GUI_ID,$HWND_TOP,$Size[0],$Size[1],$Size[2][color=#FF0000]+1[/color],$Size[3],$SWP_SHOWWINDOW)
$Size = WinGetPos($GUI_ID)
If $Size[1] < 0 Then WinMove($GUI_ID,Default,$Size[0],0)
EndFunc
Notons le "+1" rouge.! J'ai l'impression qu'il faut qu'il y est un changement dans la taille de la GUI pour que la fonction s’exécute.
Je rajouterais aussi que je n'ai pas cherché en profondeur l’utilité des paramètres de _WinAPI_SetWindowPos.
Re: [R] Redimensionner une GUI "en douceur" et fluide
Posté : ven. 05 sept. 2014 16:11
par jguinch
Pas mal

Re: [R] Redimensionner une GUI "en douceur" et fluide
Posté : ven. 05 sept. 2014 17:18
par TommyDDR
Seul problème, la fenêtre fait 601 pixel de large :3
Tenez, voilà de quoi supprimer le problème du +1 :
► Afficher le textecode
Code : Tout sélectionner
#include <Constants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 293, 240, 300, 200,$WS_POPUPWINDOW)
GUISetBkColor(0xadFeEB)
GUISetState()
Sleep(1000)
_RedimGUI($Form1,600,600)
Sleep(1000)
Func _RedimGUI($GUI_ID,$NewWidth,$NewHeight)
$Size = WinGetPos($GUI_ID)
$DeltaWidth = $NewWidth - $Size[2]
$DeltaHeight = $NewHeight - $Size[3]
GUISetStyle(BitOR($WS_POPUP,$WS_CLIPSIBLINGS),Default,$GUI_ID)
_WinAPI_SetWindowPos($GUI_ID,$HWND_TOP,$Size[0],$Size[1],$Size[2],$Size[3],$SWP_SHOWWINDOW)
$vitesse = 500
For $i = 0 To $vitesse
$iwidth = $i*($DeltaWidth/$vitesse)
$iheight = $i*($DeltaHeight/$vitesse)
If($i = $vitesse) Then
GUISetStyle($WS_POPUPWINDOW,Default,$GUI_ID)
EndIf
;~ _WinAPI_SetWindowPos($GUI_ID,$HWND_TOP,$Size[0] - $iwidth/2, $Size[1] - $iheight/2, $Size[2] + $iwidth, $Size[3] + $iheight,$SWP_SHOWWINDOW )
WinMove($GUI_ID,Default,$Size[0] - $iwidth/2, $Size[1] - $iheight/2, $Size[2] + $iwidth, $Size[3] + $iheight)
Next
$Size = WinGetPos($GUI_ID)
If $Size[1] < 0 Then WinMove($GUI_ID,Default,Default,0)
EndFunc
Re: [R] Redimensionner une GUI "en douceur" et fluide
Posté : sam. 06 sept. 2014 19:46
par yohan8
Parfait
Je viens de comprendre comment effectuer le changement de style avec
GUISetStyle, il faut coupler la fonction avec
WinMove ou
_WinAPI_SetWindowPos.
du coup en enlevant un maximum de code on arrive à éviter d'utiliser l'include
WinAPI.au3
► Afficher le texte
Code : Tout sélectionner
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 293, 240, 300, 200,$WS_POPUPWINDOW)
GUISetBkColor(0xadFeEB)
GUISetState()
Sleep(1000)
_RedimGUI($Form1,600,600)
Sleep(1000)
Func _RedimGUI($GUI_ID,$NewWidth,$NewHeight)
$Size = WinGetPos($GUI_ID)
$DeltaWidth = $NewWidth - $Size[2]
$DeltaHeight = $NewHeight - $Size[3]
GUISetStyle(BitOR($WS_POPUP,$WS_CLIPSIBLINGS),Default,$GUI_ID)
$vitesse = 500
For $i = 0 To $vitesse
$iwidth = $i*($DeltaWidth/$vitesse)
$iheight = $i*($DeltaHeight/$vitesse)
If($i = $vitesse) Then GUISetStyle($WS_POPUPWINDOW,Default,$GUI_ID)
WinMove($GUI_ID,Default,$Size[0] - $iwidth/2, $Size[1] - $iheight/2, $Size[2] + $iwidth, $Size[3] + $iheight)
Next
$Size = WinGetPos($GUI_ID)
If $Size[1] < 0 Then WinMove($GUI_ID,Default,Default,0)
EndFunc