Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Redimensionnement fenêtre

5 réponses
Avatar
Jean-Marie Arsac
Bonjour,

Comment conserver le ration hauteur/largeur lors du redimensionnement d'une
fenêtre d'application ?

Merci de votre aide

Jean-Marie

5 réponses

Avatar
le_troll
Bonjour,
Si je comprends, tu veux un ratio identique en toute circonstance pour une
fenêtre X, ben fait faire des règles de 3, ainsi:
ScaleWidth ou Widht et idem pour ScaleHeight ou Height, (scale c'est
l'intérieur, et l'autre l'extérieur), ainsi tu fais donc, en prenant les
données voulues:
100 / plus grand * plus petit = pourcentage
Et ce pourcentage tu l'appliques aux données sus-citées dans le code du
procédure de redimensionnement...
Si tu veux plus de précisions demandes...
--
Merci, @+, bye, Joe :
----------------------------------------------------------
Avec une hache, celui qui tient le manche a toujours raison.
----------------------------------------------------------


"Jean-Marie Arsac" a écrit dans le message de news:

Bonjour,

Comment conserver le ration hauteur/largeur lors du redimensionnement


d'une
fenêtre d'application ?

Merci de votre aide

Jean-Marie


Avatar
Zoury
Salut Jean-Marie! :O)

Je te conseille de sousclasser le message WM_SIZING envoyé au formulaire
lorsque la fenêtre se redimensionne...

regarde l'exemple ci-dessous :
'***
' Form1
Option Explicit

Private Sub Form_Load()
Call SubClass(Me.hwnd)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call UnSubClass(Me.hwnd)
End Sub
'***
' Module1
Option Explicit

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Declare Function CallWindowProc _
Lib "user32" _
Alias "CallWindowProcA" _
( _
ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long _
) As Long

Private Declare Function SetWindowLong _
Lib "user32" _
Alias "SetWindowLongA" _
( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long _
) As Long

Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" _
( _
ByRef pDst As Any, _
ByRef pSrc As Any, _
ByVal ByteLen As Long _
)

Private Const WM_SIZING As Long = &H214
Private Const WMSZ_LEFT As Long = 1
Private Const WMSZ_RIGHT As Long = 2
Private Const WMSZ_TOP As Long = 3
Private Const WMSZ_BOTTOM As Long = 6

Private Const GWL_WNDPROC As Long = -4
Private m_lOldProc As Long

Public Sub SubClass(ByRef hwnd As Long)
m_lOldProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub UnSubClass(ByRef hwnd As Long)
SetWindowLong hwnd, GWL_WNDPROC, m_lOldProc
End Sub

Public Function WindowProc _
( _
ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long _
) As Long

Dim rc As RECT

If (uMsg = WM_SIZING) Then

Select Case wParam

Case WMSZ_LEFT, WMSZ_RIGHT

' lParam pointe vers une structure RECT
' contenant la nouvelle dimension du
' formulaire (dimension actuelle)
'
' il suffit donc de récupérer
' l'information de la structure
'
Call CopyMemory(rc, ByVal lParam, LenB(rc))

' calculer la nouvelle hauteur ou largeur
' en fonction de la nouvelle largeur ou
' hauteur.. (note que les propriétés Width et Heigth
' du formulaire ne sont pas encore mise à jour)
'
rc.Bottom = rc.Bottom + (rc.Right - rc.Left - (Form1.Width /
Screen.TwipsPerPixelX))

' remettre la nouvelle structure (modifiée)
' à la place de l'autre structure
'
Call CopyMemory(ByVal lParam, rc, LenB(rc))

Case WMSZ_TOP, WMSZ_BOTTOM

Call CopyMemory(rc, ByVal lParam, LenB(rc))
rc.Right = rc.Right + (rc.Bottom - rc.Top - (Form1.Height /
Screen.TwipsPerPixelY))
Call CopyMemory(ByVal lParam, rc, LenB(rc))

End Select

End If

' On renvoit l'info au système pour qu'il la traite
WindowProc = CallWindowProc(m_lOldProc, hwnd, uMsg, wParam, lParam)

End Function
'***

Note qu'avec cette exemple tu ne peux pas faire de pas à pas durant le
subclassing, cela aura pour effet de faire planter VB.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
"Jean-Marie Arsac" wrote in message
news:
Bonjour,

Comment conserver le ration hauteur/largeur lors du redimensionnement


d'une
fenêtre d'application ?

Merci de votre aide

Jean-Marie


Avatar
François Picalausa
Bonjour/soir,

Pourquoi pas simplement l'événement resize du form qui est appelé une fois
en fin de redimensionnement si il est spécifié dans les options de windows
de ne montrer que la bordure ou plusieurs fois si on demande d'afficher le
contenu de la fenêtre au resize/déplacement?

On a moins de contrôle qu'avec WM_SIZING, mais en règle générale, ça
suffit... enfin je crois...
C'est juste une nouvelle mode ou l'événement Resize a des problèmes qui
m'ont été caché? ;-)

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:%
Je te conseille de sousclasser le message WM_SIZING envoyé au
formulaire lorsque la fenêtre se redimensionne...

regarde l'exemple ci-dessous :
'***
' Form1
'Code
End Function
'***

Note qu'avec cette exemple tu ne peux pas faire de pas à pas durant le
subclassing, cela aura pour effet de faire planter VB.


Avatar
Zoury
Salut! :O)

Pourquoi pas simplement l'événement resize du form



Je n'ai pas essayé craignant un effet de "scintellement" du formulaire..
L'effet serait peut-être le même.. :OP



Mon code ne fonctionne toutefois pas correctement car il ne préserve pas le
ratio.... il faut donc apporter les modifications suivantes :

ajouter cette ligne dans le Form_Load :
'***
m_fRatioLargeurHauteur = Me.Width / Me.Height
'***

ajouter la déclaration suivante dans le module :
'***
Public m_fRatioLargeurHauteur As Single
'***

remplacer la ligne suivante du module :
'***
rc.Bottom = rc.Bottom + (rc.Right - rc.Left - (Form1.Width /
Screen.TwipsPerPixelX))
'***
par celle-ci :
'***
rc.Bottom = ((rc.Right - rc.Left) / m_fRatioLargeurHauteur) + rc.Top
'***

et remplacer la ligne suivante du module :
'***
rc.Right = rc.Right + (rc.Bottom - rc.Top - (Form1.Height /
Screen.TwipsPerPixelY))
'***
par celle-ci :
'***
rc.Right = ((rc.Bottom - rc.Top) * m_fRatioLargeurHauteur) + rc.Left
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
Patrice Henrio
J'utilise resize pour cela avec un dessin dans un picture box qui est refait
à chaque dimenssionnement de la fenêtre et ça marche impec.
Il faut simplement décider quelle dimension on change par programme : width
ou height. Ce n'est pas le même à chaque fois selon que l'on essaie de
modifier à la souris l'une des dimensions, il faut changer l'autre par
programme

Je verrai quelque chose comme

Sub Form1_Resize()
'la hauteur précédente est conservée pour savoir de que l'on vient de
redimensionner. De même pour la largeur. Le ratio est une constante.
If Me.Height<>Hauteur then
Largeur=Hauteur*Ratio
Me.Width=Largeur
ElseIf Me.Width<>Largeur then
Hauteur=Largeur/Ratio
Me.Height=Hauteur
End If
End Sub



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:uqYD%
Salut! :O)

> Pourquoi pas simplement l'événement resize du form

Je n'ai pas essayé craignant un effet de "scintellement" du formulaire..
L'effet serait peut-être le même.. :OP



Mon code ne fonctionne toutefois pas correctement car il ne préserve pas


le
ratio.... il faut donc apporter les modifications suivantes :

ajouter cette ligne dans le Form_Load :
'***
m_fRatioLargeurHauteur = Me.Width / Me.Height
'***

ajouter la déclaration suivante dans le module :
'***
Public m_fRatioLargeurHauteur As Single
'***

remplacer la ligne suivante du module :
'***
rc.Bottom = rc.Bottom + (rc.Right - rc.Left - (Form1.Width /
Screen.TwipsPerPixelX))
'***
par celle-ci :
'***
rc.Bottom = ((rc.Right - rc.Left) / m_fRatioLargeurHauteur) + rc.Top
'***

et remplacer la ligne suivante du module :
'***
rc.Right = rc.Right + (rc.Bottom - rc.Top - (Form1.Height /
Screen.TwipsPerPixelY))
'***
par celle-ci :
'***
rc.Right = ((rc.Bottom - rc.Top) * m_fRatioLargeurHauteur) + rc.Left
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous