none
POSITIONNER LA FORM (AVEC UN MAXIMUMSIZE < SCREEN) AU CENTRE DE L"ÉCRAN APRÈS AGRANDISSEMENT RRS feed

  • 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.        
    lundi 22 mai 2017 04:57

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

    lundi 22 mai 2017 11:44
  • 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:



    mardi 23 mai 2017 08:58

Toutes les réponses

  •  CenterToScreen() est le plus simple pour centrer une fenêtre.
    lundi 22 mai 2017 08:26
  • 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.

    lundi 22 mai 2017 09:16
  • 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

    lundi 22 mai 2017 10:38
  • 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

    lundi 22 mai 2017 11:44
  • Bonjour et merci d'avoir pris le temps de répondre.

    L'exemple est extraordinaire et marche très bien.

    Malheureusement, il ne marche pas dans le sens maxi vers mini.

    Cependant, si ceci n'est pas possible, je me contenterais de cette solution.

    mardi 23 mai 2017 03:23
  • 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:



    mardi 23 mai 2017 08:58
  • 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)

    mercredi 24 mai 2017 08:16
  • Si les posts ont aidés, marquez les comme solutions pour clore le Thread.

    Merci

    mercredi 24 mai 2017 09:12