Question

Mon client me souhaite modifier les boutons Maximisez par défaut des fonctionnalités pour optimiser la forme sur tous les écrans du client ont. Je l'ai déjà écrit du code pour mesurer le rectangle correct de mettre la forme, mais quand je l'attribuer à l'attribut MaximisedBounds de la forme, il y a quelques issures: L'écran (dans mes 2 tests d'écran) que la forme était pas avant le clic obtenir une seule peinture, ans si vous cliquez sur le formulaire sur l'autre écran, il est comme vous avez cliqué sur « sous » il sur la fenêtre suivante dessous.

Bien sûr, il existe d'autres moyens pour résoudre ce problème (comme dans événement lorsqu'une fenêtre se maximisée / non maximisé ), i wounder si le comportement décrit est un bug ou une erreur. Y at-il quelque chose à faire avant de changer les MaximisedBounds attribut pour le faire fonctionner?

Était-ce utile?

La solution

Je suis d'accord avec Matt. Réglage des « MaximizedBounds » est pas une bonne idée. Comme il est écrit dans lorsqu'une fenêtre se maximisée / non maximisé , je substituer la méthode WndProc. Là, vous pouvez gérer les différentes commandes reçues de votre fenêtre sur votre propre.

La principale chose à faire est d'écrire votre propre code pour la « SC_MAXIMIZE » -windowcommand (comme écrit dans l'article ci-dessus référencé). Là, vous pouvez régler manuellement la taille de la forme par exemple Dans ce cas, la forme ne sera pas vraiment maximisé. En fait, est-il encore en WindowState normal. Pour empêcher l'utilisateur de changer cet état, vous devez « attraper » d'autres windowcommands.

La méthode WndProc surchargée pourrait ressembler à ceci:

    protected override void WndProc(ref Message m)
    {
        if(m.Msg == 0x0112) // WM_SYSCOMMAND
        {
            if(m.WParam == new IntPtr(0xF012)) //TITLE_CLICK_ONCE
            {
                // catch, this command can occur, when form starts to move
            }

            if(m.WParam == new IntPtr(0xF001) // RESIZE_ON_EDGE
            || m.WParam == new IntPtr(0xF002)
            || m.WParam == new IntPtr(0xF003)
            || m.WParam == new IntPtr(0xF004)
            || m.WParam == new IntPtr(0xF005)
            || m.WParam == new IntPtr(0xF006)
            || m.WParam == new IntPtr(0xF007)
            || m.WParam == new IntPtr(0xF008))
            {
                // catch the resizing
            }

            if(m.WParam == new IntPtr(0xF032)) // SECOND_CLICK_ON_TITLEBAR
            {
                // catch. causes a maximization (or resuming to normal window-mode)
            }

            if(m.WParam == new IntPtr(0xF030)) //SC_MAXIMIZE
            {
                // the actual point, where to enter your code
                // this command occurs, when the "Maximize"-button is pressed
            }
        }

        // maybe abort calling of the base-method at specified window-commands,
        // when you want to make your own code by simply "return;"
        base.WndProc(ref m);
    }

Autres conseils

Je suis en mesure de faire des formulaires à remplir les 2 écrans entiers en définissant la propriété de Size directement, plutôt que la valeur MaximisedBounds.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top