OVH Cloud OVH Cloud

Le MDI child ne doit pas dépasser le MDI Parent ?

4 réponses
Avatar
404 found
bonjour,
j'ai un MDI Parent et des MDI child !!

je peux en sélectionnant le MDI child par la souris le déplacer dans le MDI
parent mais ce que je ne veux pas c'est que le MDI child dépasse les limites
du MDI Parents !!
En d'autre termes, le MDI Parent est en "Maximized" et ne doit pas avoir de
scroll barr verticale, donc les MDI child ne doivent pas dépasser le MDI
Parent !!

j'espère que c'est claire !!

je ne sais pas s'il y a une propriétée ou si cela se fait par code !

4 réponses

Avatar
Zoury
Salut ! :O)

Tu dois overrider la WndProc() de tes formulaires enfants et modifier le
comportement standard des fenêtres lors du déplacement en agissant sur le
message WM_MOVING :
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_moving.asp

Le paramètre LParam nous fournit une structure RECT qui nous fournit la
nouvelle position de la fenêtre enfant avant que celle-ci soit redessinée.
Il suffit de vérifier si la position de la fenêtre dépasse les bordures de
la zone clientèle de la MDI et d'altérer la structure RECT au besoin.

Je t'ai fait un tit exemple :
'***
Option Explicit On

Imports System.Runtime.InteropServices

Public Class Form2
Inherits System.Windows.Forms.Form

Private m_rcAPIChildPrev As RECT

Private Const WM_MOVING As Int32 = &H216

<StructLayout(LayoutKind.Sequential)> _
Private Structure RECT
Public Left As Int32
Public Top As Int32
Public Right As Int32
Public Bottom As Int32
End Structure

' Code généré par le Concepteur Windows Form

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

Dim rcAPIChild As RECT

' on veut intervenir lors du déplacement de la fenêtre
If (m.Msg = WM_MOVING) Then

' on récupère la nouvelle position de la fenêtre via LParam
' les coordonnées sont fournies en relation avec l'écran
rcAPIChild = DirectCast(Marshal.PtrToStructure(m.LParam,
GetType(RECT)), RECT)

' on vérifie si la fenêtre enfant est entièrement contenu dans
la zone cliente de la fenêtre parent
' les valeurs +2 et +4 sont des tolérances ajoutés pour
éviter l'apparition de scrollbars
If (Not
Me.MdiParent.RectangleToScreen(Me.MdiParent.ClientRectangle).Contains(New
Rectangle(rcAPIChild.Left - 2, rcAPIChild.Top - 2, rcAPIChild.Right -
rcAPIChild.Left + 4, rcAPIChild.Bottom - rcAPIChild.Top + 4))) Then

' si la fenêtre enfant n'est pas totalement comprise dans la
MDI,
' on annule le déplacement en remplaçant la structure RECT
hors borne
' par la dernière structure RECT valide que l'on a
conservée
Marshal.StructureToPtr(m_rcAPIChildPrev, m.LParam, True)
Else
' conserve la position actuelle qui est à l'intérieur du MDI
m_rcAPIChildPrev = rcAPIChild
End If

End If

' exécute le déplacement
MyBase.WndProc(m)

End Sub

End Class
'***

j'espère que c'est claire !!



Moi aussi ..! ;O)

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Vincent Poyo
Pourquoi avec .NET on doit toujours utiliser des anciennes techniques comme
wndproc qui sont censé être obsolètes ou du moins masquées ?
Il y a pas une méthode .NET véritable qui permette de faire la même chose ?
C'est quand même bizare que Microsoft n'ai pas pensé à ça !!!


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

Tu dois overrider la WndProc() de tes formulaires enfants et modifier le
comportement standard des fenêtres lors du déplacement en agissant sur le
message WM_MOVING :
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_moving.asp

Le paramètre LParam nous fournit une structure RECT qui nous fournit la
nouvelle position de la fenêtre enfant avant que celle-ci soit redessinée.
Il suffit de vérifier si la position de la fenêtre dépasse les bordures de
la zone clientèle de la MDI et d'altérer la structure RECT au besoin.

Je t'ai fait un tit exemple :
'***
Option Explicit On

Imports System.Runtime.InteropServices

Public Class Form2
Inherits System.Windows.Forms.Form

Private m_rcAPIChildPrev As RECT

Private Const WM_MOVING As Int32 = &H216

<StructLayout(LayoutKind.Sequential)> _
Private Structure RECT
Public Left As Int32
Public Top As Int32
Public Right As Int32
Public Bottom As Int32
End Structure

' Code généré par le Concepteur Windows Form

Protected Overrides Sub WndProc(ByRef m As
System.Windows.Forms.Message)

Dim rcAPIChild As RECT

' on veut intervenir lors du déplacement de la fenêtre
If (m.Msg = WM_MOVING) Then

' on récupère la nouvelle position de la fenêtre via LParam
' les coordonnées sont fournies en relation avec l'écran
rcAPIChild = DirectCast(Marshal.PtrToStructure(m.LParam,
GetType(RECT)), RECT)

' on vérifie si la fenêtre enfant est entièrement contenu dans
la zone cliente de la fenêtre parent
' les valeurs +2 et +4 sont des tolérances ajoutés pour
éviter l'apparition de scrollbars
If (Not
Me.MdiParent.RectangleToScreen(Me.MdiParent.ClientRectangle).Contains(New
Rectangle(rcAPIChild.Left - 2, rcAPIChild.Top - 2, rcAPIChild.Right -
rcAPIChild.Left + 4, rcAPIChild.Bottom - rcAPIChild.Top + 4))) Then

' si la fenêtre enfant n'est pas totalement comprise dans
la
MDI,
' on annule le déplacement en remplaçant la structure
RECT
hors borne
' par la dernière structure RECT valide que l'on a
conservée
Marshal.StructureToPtr(m_rcAPIChildPrev, m.LParam, True)
Else
' conserve la position actuelle qui est à l'intérieur du
MDI
m_rcAPIChildPrev = rcAPIChild
End If

End If

' exécute le déplacement
MyBase.WndProc(m)

End Sub

End Class
'***

j'espère que c'est claire !!



Moi aussi ..! ;O)

--
Cordialement
Yanick
MVP pour Visual Basic




Avatar
Zoury
> Pourquoi avec .NET on doit toujours utiliser des anciennes techniques


comme
wndproc qui sont censé être obsolètes ou du moins masquées ?



Obsolètes ? nope. tant que Windows fonctionnera avec des queues de messages,
la WndProc() et tous ce qu'on peut faire avec existera.

Si la WndProc() était masquée en VB6, c'est parce que VB est à la base un
language visant les non initiés. Les APIs nous permettaient toutefois de
subclasser cette méthode aisément. .NET nous offre la même possibilité mais
de façon beaucoup plus intuitive et plaisante.

Il ne faut pas oublier que VB.NET est un langage de programmation.. il ne
change pas la façon dont Windows fonctionne, au contraire, il doit fournir
les outils nécessaires pour travailler avec Windows. :O)


Il y a pas une méthode .NET véritable qui permette de faire la même chose


?
C'est quand même bizare que Microsoft n'ai pas pensé à ça !!!



Faire la même chose que quoi ? Modifier la WndProc() ou empêcher un
formulaire de sortir d'une limite déterminée ?

Si tu parles de la WndProc() , l'overrides *est* la technique véritable.
C'est entièrement orientée objet et intégrée au langage, aucune API n'est
nécessaire pour faire cela.
Si tu parles de limité la fenêtre dans ses déplacements, alors là non, il
n'ont rien fait d'intégré. Il faut cependant convenir que ce n'est pas un
besoin commun à tous et qu'au moins il y a possibilité de le faire... :O)

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Jacques93
Bonsoir Zoury,
Zoury a écrit :
Pourquoi avec .NET on doit toujours utiliser des anciennes techniques



comme

wndproc qui sont censé être obsolètes ou du moins masquées ?




Obsolètes ? nope. tant que Windows fonctionnera avec des queues de messages,
la WndProc() et tous ce qu'on peut faire avec existera.

Si la WndProc() était masquée en VB6, c'est parce que VB est à la base un
language visant les non initiés. Les APIs nous permettaient toutefois de
subclasser cette méthode aisément. .NET nous offre la même possibilité mais
de façon beaucoup plus intuitive et plaisante.

Il ne faut pas oublier que VB.NET est un langage de programmation.. il ne
change pas la façon dont Windows fonctionne, au contraire, il doit fournir
les outils nécessaires pour travailler avec Windows. :O)




[...]

Pour compléter tes propos, si tu le permets (de toute façon t'as pas le
choix :-D ), à l'origine .Net devait (et doit toujours ?) faire
abstraction le plus possible de la plate-forme sur laquelle il tourne
afin d'une part d'être portable, et que tous les langages .Net utilisent
le même Run-Time (CLR). A l'instar de Java ???

OK, je sors.


--
Cordialement,

Jacques.