2010-04-19 3 views
3

Utilisation de winforms Je me demande s'il existe un moyen d'empêcher le redimensionnement vertical du formulaire. Je voudrais permettre à l'utilisateur de redimensionner la forme dans toutes les directions sauf verticalement. De plus, je voudrais autoriser le redimensionnement vertical vers le haut, mais pas vers le bas.Winforms: comment empêcher le redimensionnement vertical dans VB.NET

J'ai essayé d'utiliser MaximumSize en mettant à: Me.maximumsize = nouvelle taille (0, me.height)

Je Paramétrez la largeur sur 0 parce que je veux permettre à l'utilisateur de modifier la largeur de forme.

Malheureusement, cela ne fonctionne pas.

Des idées?

Répondre

8

Vous devez faire attention à autoriser le formulaire à se redimensionner au démarrage. Nécessaire pour prendre en charge la mise à l'échelle nécessaire sur une machine dotée d'un paramètre de résolution vidéo différent ou d'une taille de police système différente. Ou un utilisateur qui a modifié la hauteur de la barre de titre. Tout ceci est trié au moment où l'événement Load s'exécute. Ainsi:

protected override void OnLoad(EventArgs e) { 
    Screen scr = Screen.FromControl(this); 
    this.MinimumSize = new Size(this.MinimumSize.Width, this.Height); 
    this.MaximumSize = new Size(scr.WorkingArea.Width, this.Height); 
} 

La prochaine chose que vous devez faire est de fixer le comportement du curseur lorsque l'utilisateur se déplace sur un bord de la fenêtre qui permet de redimensionner la fenêtre verticalement. C'est un peu laid, vous devez piéger le message WM_NCHITTEST avec WndProc et modifiez la valeur de retour du message:

protected override void WndProc(ref Message m) { 
    base.WndProc(ref m); 
    if (m.Msg == 0x84) { // Trap WM_NCHITTEST 
    switch (m.Result.ToInt32()) { 
     case 12: m.Result = (IntPtr)2; break; // HTTOP to HTCAPTION 
     case 13: m.Result = (IntPtr)10; break; // etc.. 
     case 14: m.Result = (IntPtr)11; break; 
     case 15: m.Result = (IntPtr)1; break; 
     case 16: m.Result = (IntPtr)10; break; 
     case 17: m.Result = (IntPtr)11; break; 
    } 
    } 
} 
+0

Excellent échantillon! C'est juste ce que je veux. Ici il y a d'autres bonnes solutions mais je pense que c'est celle qui correspond le mieux à mes besoins. Avec cela, je peux prendre le contrôle total de toutes les directions de redimensionnement. Excellent extrait de code! Mais une chose, j'ai un doute ... Je me demande si je peux changer les valeurs de retour de message aux valeurs que je veux. Est-ce important les valeurs du message que vous retournez ou non? Pouvez-vous en retourner un? Pourquoi renvoyez-vous ces valeurs et pas d'autres? Merci beaucoup! – user304602

+0

Consultez les documents MSDN pour WM_NCHITTEST. http://msdn.microsoft.com/en-us/library/ms645618%28VS.85%29.aspx –

+0

Voir aussi http://stackoverflow.com/a/2140908/521757 pour plus d'API. – jnm2

1

Il existe plusieurs solutions. Facile est la suivante:

Dim originalSize As Integer = Me.Height 

Private Sub Form1_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize 
    If Me.Height <> originalSize Then 
     Me.Height = originalSize 
    End If 
End Sub 

ont à l'esprit que redimensionne sont toujours vers le bas, lorsque vous redimensionnez jusqu'à ce que vous faites est de changer l'emplacement de la forme et le redimensionnement vers le bas.

+0

Bonne idée de vérifier si la hauteur doit être modifiée ou non car le changement de hauteur provoquera le déclenchement d'un autre événement Resize, et ainsi de suite. Sans le 'if', vous seriez coincé dans une boucle infinie. –

+0

Bonne solution mais dans mon cas le seul problème est que je vais devoir mettre à jour constamment la variable originalSize en différents points et ce n'est pas très confortable pour moi. Mais votre solution est bonne! merci – user304602

+1

Vous pouvez simplement créer une propriété personnalisée qui met à jour la taille du formulaire et met également à jour la variable originalSize en même temps. –

0

Enregistrez-vous pour Control.Resize Événement et appliquez la hauteur désirée.

3

Set maximum & de forme propriétés de taille minimum ou écrire le code ci-dessous à Form_Load:

this.MaximumSize=new System.Drawing.Size(2048, 300); 
this.MinimumSize=new System.Drawing.Size(0, 300); 

Donnez hauteur à la fois.

1

La plupart des développeurs de temps a mis la de la taille à la conception de sorte que le code serait

private void FormLogin_Load(object sender, EventArgs e) 
{ 
    this.MaximumSize = this.Size; 
    this.MinimumSize = this.Size; 

} 
Questions connexes