Meilleur auteur de réponses
POSITIONNER LA FORM (AVEC UN MAXIMUMSIZE < SCREEN) AU CENTRE DE L"ÉCRAN APRÈS AGRANDISSEMENT

Question
-
Bonjour à tous.
Je fais appel à la communauté pour résoudre un problème sur lequel je suis depuis une semaine.
Il s'agit de l’agrandissement d'une forme avec positionnement au centre de l'écran.
Cette forme (pour saisie de mot de passe) a la taille suivante au départ :
size (596; 475)
L'agrandissement est conditionné par le maximumsize :
(696; 575) Taille plus petite que l'écran.
C'est pourquoi j'ai besoin du positionnement au centre de l'écran après agrandissement.
Je suis en Visual studio express 2010
Dans le Resize j'effectue l'opération classique suivante :
Dim myControl As Object = sender
myControl.Left = CInt((Screen.PrimaryScreen.Bounds.Width / 2) - (myControl.Width / 2))
myControl.Top = CInt((Screen.PrimaryScreen.Bounds.Height / 2) - (myControl.Height / 2))
Résultat, la forme est cadrée dans le coin haut gauche de l'écran et NON centrée)
Il y a plus incompréhensible :
En exécution, je mets un point d'arrêt sur la première ligne myControl.Left =....
myControl.Left=-8
CInt((Screen.PrimaryScreen.Bounds.Width / 2) - (myControl.Width / 2)) = 612
Après appui sur F8, myControl.Left est toujours égal à _8
Je ne comprends pas.
Merci d'avance pour vos réponses.
Réponses
-
La logique du position est telle qu'une Form Maximized ne peut qu'être positionnée dans le coin supérieur gauche: voyez cette référence https://msdn.microsoft.com/en-us/library/aa266976(v=vs.60).aspx.
Donc, en utilisant la Property MaximumSize 400; 400 la Form ne peut qu'être dans le coin supérieur gauche.
Il faut créer une tailleMaximum programmatiquement...
Avec le code:
Private tailleMaximum As Size Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load tailleMaximum = New Size(400, 400) Debug.Print("Taille : " & Size.Width & ";" & Size.Height) Debug.Print("Position : " & Location.X & ";" & Location.Y) End Sub Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged If Me.WindowState = FormWindowState.Maximized Then Me.WindowState = FormWindowState.Normal Me.Size = tailleMaximum Me.Location = New Point((Screen.PrimaryScreen.WorkingArea.Width - Me.Size.Width) \ 2, (Screen.PrimaryScreen.WorkingArea.Height - Me.Size.Height) \ 2) End If End Sub
- Modifié Cyrille Précetti lundi 22 mai 2017 11:53
- Marqué comme réponse Nina ZaekovaMicrosoft contingent staff, Moderator vendredi 2 juin 2017 08:42
-
Ah, c'est une question subsidiaire... et vous voulez probablement dire après Agrandir l'action Niveau Inférieur:
Vous noterez que le bouton "Agrandir" ne se transforme pas en "Niveau inférieur" dans ma solution.
DONC, il est concevable de tester si la Form est dans l'état "maximum" et d'interpréter alors différemment "Agrandir" pour revenir au "minimum".
Mais je pense que du point de vue User Interface c'est corrompre la signification du bouton Agrandir.
Je ne recommande pas de faire cela (et Microsoft non plus), mais plutôt de créer votre propre bouton Max/Min et votre propre ControlBox:
- Modifié Cyrille Précetti mardi 23 mai 2017 10:53 spelling!
- Marqué comme réponse Nina ZaekovaMicrosoft contingent staff, Moderator vendredi 2 juin 2017 08:42
Toutes les réponses
-
-
Merci pour la réponse mis le problème est plus complexe.
je précise que la forme a son startposition a CenterToScreen bien sur.
pour répondre à ma question, faites le petit test suivant (vous en avez pour 5 minutes)
prenez un projet de test ou un nouveau projet
creez une form sans aucun controle avec startposition a CenterToScreen
copiez la size donnée par visual (308; 305) et mettez la dans minimumsize et dans maximumsize
augmentez maximumsize pour avoir (408; 405)
lancez l'execution
maximisez la forme affichée et malheureusement elle ira dans le coin superieur gauche.
or je veux la voir au centre de l'écran.
si vous y arrivez , j'aurai grand plaisir à lire votre solution et à l'appliquer.
merci d'avance
a bientot j'espère.
-
Une méthode est d'intercepter WM_GETMINMAXINFO
et ptMaxPosition pour la repositionner au centre
(+ ptMinTrackSize et ptMaxTrackSize pour limiter les dimensions)
(testé sous Windows 10, VS 2015)
Public Const WM_GETMINMAXINFO = &H24 Private Structure MINMAXINFO Public ptReserved As Point Public ptMaxSize As Point Public ptMaxPosition As Point Public ptMinTrackSize As Point Public ptMaxTrackSize As Point End Structure
- Modifié Castorix31 lundi 22 mai 2017 10:40
-
La logique du position est telle qu'une Form Maximized ne peut qu'être positionnée dans le coin supérieur gauche: voyez cette référence https://msdn.microsoft.com/en-us/library/aa266976(v=vs.60).aspx.
Donc, en utilisant la Property MaximumSize 400; 400 la Form ne peut qu'être dans le coin supérieur gauche.
Il faut créer une tailleMaximum programmatiquement...
Avec le code:
Private tailleMaximum As Size Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load tailleMaximum = New Size(400, 400) Debug.Print("Taille : " & Size.Width & ";" & Size.Height) Debug.Print("Position : " & Location.X & ";" & Location.Y) End Sub Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged If Me.WindowState = FormWindowState.Maximized Then Me.WindowState = FormWindowState.Normal Me.Size = tailleMaximum Me.Location = New Point((Screen.PrimaryScreen.WorkingArea.Width - Me.Size.Width) \ 2, (Screen.PrimaryScreen.WorkingArea.Height - Me.Size.Height) \ 2) End If End Sub
- Modifié Cyrille Précetti lundi 22 mai 2017 11:53
- Marqué comme réponse Nina ZaekovaMicrosoft contingent staff, Moderator vendredi 2 juin 2017 08:42
-
-
Ah, c'est une question subsidiaire... et vous voulez probablement dire après Agrandir l'action Niveau Inférieur:
Vous noterez que le bouton "Agrandir" ne se transforme pas en "Niveau inférieur" dans ma solution.
DONC, il est concevable de tester si la Form est dans l'état "maximum" et d'interpréter alors différemment "Agrandir" pour revenir au "minimum".
Mais je pense que du point de vue User Interface c'est corrompre la signification du bouton Agrandir.
Je ne recommande pas de faire cela (et Microsoft non plus), mais plutôt de créer votre propre bouton Max/Min et votre propre ControlBox:
- Modifié Cyrille Précetti mardi 23 mai 2017 10:53 spelling!
- Marqué comme réponse Nina ZaekovaMicrosoft contingent staff, Moderator vendredi 2 juin 2017 08:42
-
Avant de répondre, j'ai voulu mettre en œuvre votre solution.
Et je dois dire que c'est parfait.
Merci pour votre collaboration.
Bonne Journée.
(j'en profite pour signaler que j'ai quand même , dès réception du message concernant WM_GETMINMAXINFO, j'ai essayé de me documenter. C'était trop compliqué et j'ai abandonné. merci quand même pour la suggestion)
-