2014-06-11 2 views
1

Description decontrôle Redimensionner pour correspondre aspect ratio

Je crée un "simulateur" pour différentes résolutions. Fondamentalement, j'ai un contrôle à l'intérieur d'un panneau. Ensuite, l'utilisateur peut choisir un rapport d'aspect (plus d'informations ci-dessous) et le contrôle à l'intérieur du simulateur devrait être redimensionné pour correspondre au ratio désiré.

Problème

Le problème est que je ne sais pas ce qui est une bonne façon de calculer la taille de la commande sans avoir à utiliser beaucoup de CPU ou d'essayer ou le redimensionnement. Comment puis-je savoir si je dois redimensionner la hauteur ou la largeur du contrôle pour qu'il puisse être intégré au simulateur?

Le simulateur peut croître ou rétrécir. C'est pourquoi je ne peux pas être sûr, si le contrôle à l'intérieur de celui-ci remplira toute la largeur du simulateur, ou la hauteur, mais le rapport d'aspect devrait toujours être correct.

Conseil

Ceci est probablement un problème mathématique très facile. Je ne trouve tout simplement pas de solution en ce moment (aujourd'hui ce n'est pas mon jour)!

Si vous avez des idées ou des suggestions, n'hésitez pas à demander et à proposer!

Exemple

Example for the simulator.

Résolutions disponibles

  • 3: 2 (comme sur l'iPhone jusqu'à ce que l'iPhone 5, Tout le monde connaît un autre nom?)
  • 16: 10 (WXGA)
  • 16: 9 (écran large)
  • 4: 3 (VGA)

Merci de nous aider!

+0

Êtes-vous après 'height = width/widthRatio * heightRatio'? (ou inversement) – Sayse

+0

Ok. Mais le contrôle à l'intérieur du simulateur devrait remplir la largeur ou la hauteur du simulateur. Comment puis-je savoir si je dois prendre la hauteur du contrôle au maximum ou à la largeur? Je devrais essayer, je suppose? –

+0

Im court d'une meilleure réponse, désolé.Il y aura toujours des contrôles bizarres lorsque vous essayez d'appliquer la même mise en page à une sélection de résolutions. – Sayse

Répondre

2

Voici un petit banc d'essai. Placez un contrôle sur un formulaire et affectez-lui la variable ViewPort. Ici j'ai choisi un textBox1 mais n'importe quel contrôle fera l'affaire. Ensuite, choisissez un rapport d'aspect cible, j'ai choisi TargetRatio_3_2. Essayez-le en redimensionnant le formulaire!

Note 1: J'ai choisi un formulaire en tant que conteneur (votre Simulator) pour faciliter les tests et donc utiliser son ClientRectangle pour accéder à ses mesures internes. Tout autre contrôle fonctionnera essentiellement de la même manière. Non 2: J'ai ajouté quelques lignes pour placer le ViewPort (votre Control) au centre.

private void Form1_Resize(object sender, EventArgs e) 
{ 
    Control Container = this; 
    Control ViewPort = textBox1; 

    float ContainerRatio = 1f * Container.ClientRectangle.Width/Container.ClientRectangle.Height; 

    const float TargetRatio_3_2 = 3f/2f; 
    const float TargetRatio_16_9 = 16f/9f; 
    const float TargetRatio_4_3 = 4f/3f; 
    const float TargetRatio_16_10 = 16f/10f; 
    //.. 

    float TargetRatio = TargetRatio_3_2; 

    if (ContainerRatio < TargetRatio) 
    { 
     ViewPort.Width = Container.ClientRectangle.Width; 
     ViewPort.Height = (int)(ViewPort.Width/TargetRatio); 
     ViewPort.Top = (Container.ClientRectangle.Height - ViewPort.Height)/2; 
     ViewPort.Left = 0; 
    } 
    else 
    { 
     ViewPort.Height = Container.ClientRectangle.Height; 
     ViewPort.Width = (int)(ViewPort.Height * TargetRatio); 
     ViewPort.Top = 0; 
     ViewPort.Left = (Container.ClientRectangle.Width - ViewPort.Width)/2; 
    } 

} 
+0

C'est essentiellement comment je l'ai résolu. Je marquerai votre réponse comme acceptée. Merci pour votre aide! –

Questions connexes