2009-05-13 6 views
1

J'ai créé un formulaire de test simple avec FormBorderStyle = FixedToolWindow par défaut et ajouté un bouton qui permutera entre FixedToolWindow et SizableToolWindow en appuyant sur la souris.Comportement étrange dans FormBorderStyle entre Fixe et Sizable

Changer le FormBorderStyle entre ces deux semble produire un effet étrange qui cause beaucoup de problèmes sur mon application. Le problème est que la fenêtre semble changer de taille et je ne peux pas l'avoir. Je veux juste changer la bordure, j'ai besoin de la taille du formulaire pour rester le même.

Par exemple, voici le code du bouton:

private void button1_Click(object sender, System.EventArgs e) { 
    if(FormBorderStyle == FormBorderStyle.FixedToolWindow) { 
     System.Diagnostics.Debug.WriteLine("SWITCHING: FIXED -> SIZABLE"); 
     FormBorderStyle = FormBorderStyle.SizableToolWindow; 
    } else { 
     System.Diagnostics.Debug.WriteLine("SWITCHING: SIZABLE -> FIXED"); 
     FormBorderStyle = FormBorderStyle.FixedToolWindow; 
    } 
} 

Et pour déboguer-je utiliser ceci:

private void Settings_SizeChanged(object sender, System.EventArgs e) { 
    System.Diagnostics.Debug.WriteLine(this.Size); 
} 

Et voici la sortie quand j'appuie sur le bouton de l'interrupteur:

SWITCHING: FIXED -> SIZABLE 
{Width=373, Height=169} 
{Width=383, Height=179} 
SWITCHING: SIZABLE -> FIXED 
{Width=383, Height=179} 
{Width=373, Height=169} 

Comment réparer ce problème? Et par "réparer", je veux dire, empêcher cela de se produire si possible. Je veux être capable de spécifier la taille de mon formulaire et de rester comme ça, peu importe le type de style de bordure.

Aussi, une solution en sous-classant la classe Form serait la solution parfaite pour moi au cas où quelqu'un aurait des idées pour résoudre ce problème avec une telle méthode.

EDIT:
J'ai fait une petite vidéo pour illustrer le problème. Le premier test montre que la taille du formulaire ne change pas (visuellement), seul l'emplacement du formulaire change un peu; mais les valeurs de la propriété Size changent, comme vous pouvez le voir sur la sortie de débogage. Le deuxième test que vous verrez sur la sortie de débogage que les valeurs de la propriété Taille du formulaire changent et la taille de la fenêtre elle-même changera également.

S'il vous plaît regarder ici:
http://screencast.com/t/0vT1vCoyx2u

Répondre

2

Votre problème est avec le changement d'emplacement, pas la taille. Ce code résout le problème vu dans la vidéo.

 private void Form1_DoubleClick(object sender, EventArgs e) 
     { 
      Point _location = this.PointToScreen(this.ClientRectangle.Location); 
      if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow) 
      { 
       this.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
      } 
      else 
      { 
       this.FormBorderStyle = FormBorderStyle.SizableToolWindow; 
      } 
      Point _newloc = this.PointToScreen(this.ClientRectangle.Location); 
      Size _diff = new Size(_newloc) - new Size(_location); 
      this.Location -= _diff; 
     } 

Il me semble que la question de la forme en mouvement lors du passage rendu entre ces deux borderstyles est un bogue dans le DWM.

+0

Merci, mais cela ne m'aide pas vraiment à résoudre mon problème. C'est pourquoi j'ai créé l'autre question, parce que c'est plus lié. S'il vous plaît vérifier le commentaire que j'ai laissé là si vous êtes intéressé. Je vais marquer cette réponse comme la bonne (pour cette question bien sûr) si je pense que cela s'applique à l'avenir. Ce n'est plus pertinent pour l'instant. –

+0

Pouvez-vous élaborer sur ce que cela * ne résout pas, plutôt que de simplement ignorer cette question et de ne faire attention qu'à votre nouveau? (Ne jamais réécrire à partir de zéro quand vous pouvez refactoriser!) Refactorisez cette discussion - ne la réécrivez pas. – bsneeze

+0

Non, je ne peux pas. Pardon. Si vous ne voulez pas m'aider dans l'autre question, d'accord. C'est votre choix, mais cette question n'est plus pertinente et je ne reviendrai pas ici. Merci pour votre aide. –

1

je soupçonne que ce qui se passe est que Windows Forms est en gardant la taille du client (à savoir la zone intérieure) de la même tandis que les changements de taille à la frontière. C'est généralement une bonne chose car cela garantit que la fenêtre peut toujours s'adapter correctement au contenu que vous avez mis dessus.

Si vous souhaitez conserver les mêmes dimensions externes, vous pouvez contourner ce problème en enregistrant la taille dans une variable avant de modifier le type de bordure, puis en le restaurant de nouveau. Ils vont probablement un léger scintillement, cependant.

+0

n'a pas fonctionné, il sera en fait aggraver. :/ –

0

Cela a bien fonctionné pour moi:

private Size _size; 
    private void Form1_DoubleClick(object sender, EventArgs e) 
    { 
     _size = this.Size; 
     if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow) 
     { 
      this.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
     } 
     else 
     { 
      this.FormBorderStyle = FormBorderStyle.SizableToolWindow; 
     } 
     this.Size = _size; 
    } 
+0

Ce n'est pas, la taille du formulaire change encore ... –

+0

Si cette solution et albahari ne fonctionnent pas, il y a quelque chose que vous ne nous dites pas de vos besoins. – bsneeze

+0

Comment pourrais-je cacher quelque chose si je cherche de l'aide? Tout ce que je peux dire, c'est que cette solution ne fonctionne pas, la taille de la fenêtre change quand j'appuie sur le bouton ... –

0

J'ai eu le même problème. La taille du client change lorsque vous définissez le FormBorderStyle mais il ne semble pas être immédiatement placé dans la propriété clientrectangle. Le code ci-dessus a presque fonctionné pour moi, mais plutôt que la taille du magasin, assurez-vous de stocker des clients. Bien sûr, dans l'exemple ci-dessus peut-être que "ceci" était une référence à la clientèle - je n'étais pas sûr.Acheter de toute façon, cela a fonctionné pour moi:

_frmFilter.Height = 300 Dim _size Comme Taille = .ClientSize _frmFilter.FormBorderStyle = FormBorderStyle.FixedToolWindow _frmFilter.ClientSize = _size

+1

Je ne comprends pas votre code ni où vous l'utilisez, pouvez-vous donner un meilleur exemple? Et s'il vous plaît formater le code :) –