2016-10-11 1 views
1

J'ai un formulaire avec un tas d'étiquettes, de zones de texte enrichies, de zones de texte et de boutons. J'ai joué avec l'ancrage et l'autoscale (ppp/police), essayant d'obtenir que mon interface utilisateur ressemble plus ou moins à un large éventail de résolutions d'écran. Jusqu'à présent, j'ai fait des progrès pour redimensionner correctement les contrôles, mais maintenant je dois ajuster la taille des polices une fois que les contrôles ont changé.Y at-il un moyen d'ajuster la taille de la police sur chaque contrôle d'un formulaire avec une boucle?

J'ai essayé la solution de this question (avec une modification mineure pour ignorer le conteneur parent et utiliser l'étiquette elle-même), ce qui a bien fonctionné pour les étiquettes, mais les zones de texte n'ont pas d'événement de peinture, donc je ne peux pas obtenir le rapport de mise à l'échelle de l'information qui serait normalement passé dans e.Graphics des PaintEventArgs pour donner une taille de la chaîne:

public static float NewFontSize(Graphics graphics, Size size, Font font, string str) 
    { 
     SizeF stringSize = graphics.MeasureString(str, font); 
     float wRatio = size.Width/stringSize.Width; 
     float hRatio = size.Height/stringSize.Height; 
     float ratio = Math.Min(hRatio, wRatio); 
     return font.Size * ratio; 
    } 

    private void lblTempDisp_Paint(object sender, PaintEventArgs e) 
    { 
     float fontSize = NewFontSize(e.Graphics, lblTempDisp.Bounds.Size, lblTempDisp.Font, lblTempDisp.Text); 
     Font f = new Font("Arial", fontSize, FontStyle.Bold); 
     lblTempDisp.Font = f; 

    } 

question primaire: y at-il une manière similaire pour régler la taille de la police des zones de texte?

Secondary Question: Quelle serait la bonne façon de faire défiler toutes les commandes d'un type sur mon formulaire? J'ai essayé:

foreach (Label i in Controls) 
     { 
      if (i.GetType() == Label)//I get an error here that says 
      //"Label is a type, which is not valid in the given context" 
      { 
       i.Font = f; 
      } 
     } 

et je sais qu'il est un moyen de vérifier si un contrôle est une étiquette, mais cela ne marche pas semble l'être.

+0

Essayez d'utiliser l'opérateur 'is' au lieu de' '== lorsque l'on compare les types. – Roy123

+0

foreach (Label i dans Controls) ne peut pas fonctionner parce que vous essayez de mettre des contrôles non libellés dans i qui est Label. – GuidoG

+0

La police est une propriété ambiante et si vous définissez la police d'un contrôle parent, tous ses enfants utiliseront la même police. Donc je ne pense pas que vous ayez besoin d'une boucle pour assigner la police à tous les contrôles, sauf si vous devez appliquer la police à tous les contrôles enfants d'un type spécifique, dans ce cas vous pouvez jeter un coup d'œil à [ce post] /stackoverflow.com/questions/3419159/how-to-get-all-child-controls-of-a-windows-forms-form-of-a-specific-type-button). –

Répondre

3

pour votre deuxième question:

Une autre façon est la suivante:

foreach (Label label in Controls.OfType<Label>()) 
{ 
    label.Font = f; 
}