Garder l'echelle lors d'un resize [Résolu]

Tuizi 144 Messages postés samedi 21 octobre 2000Date d'inscription 7 mai 2009 Dernière intervention - 25 juil. 2006 à 20:02 - Dernière réponse : Tuizi 144 Messages postés samedi 21 octobre 2000Date d'inscription 7 mai 2009 Dernière intervention
- 11 sept. 2006 à 20:04
Bonjour,
Voila, je suis tomber sur un problème qui me fait m'arracher les cheveux

Je m'explique:

J'ai une pictureBox qui contient une grande image (SizeMode = Zoom), on va dire que c'est notre image de fond, et par dessus je peux déplacer une autre picturebox.
Le problème est que lorsque je passe en SizeMode = AutoSize, je voudrais que les coordonnées de la deuxieme picturebox soit mis- à l'echelle :s

J'ai bien essayer de jouer avec les pourcentage d'agrandissement ou de diminution, mais ça me sort des resultat farfelut !!!

Help!

Tuizi
Afficher la suite 

36 réponses

Répondre au sujet
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 15 août 2006 à 18:54
+3
Utile
Oui c'est tout à fait possible, avec le TableLayoutPanel comme déjà dit 1000x !
Créer un nouveau projet (incorpore tes images comme dans le projet que tu as mis en téléchargement) puis ajoute ceci dans Form1 :

using

System;
using System.Windows.Forms;

namespace Test_Graphic
{
   public partial class Form1 : Form
  {
      private TableLayoutPanel _tableLayoutPanel = newTableLayoutPanel();
      private PictureBox _pBox = newPictureBox();      public Form1()
      {
         this.InitializeComponent();
         this.Init();
      }

      privatevoid Init()
      {
         this._pBox.Image = global::Test_Graphic.Properties.Resources.ram;
         this._pBox.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
         this._tableLayoutPanel.SuspendLayout();
         this._tableLayoutPanel.Anchor = System.Windows.Forms.AnchorStyles.Top 
         | System.Windows.Forms.AnchorStyles.Bottom
         | System.Windows.Forms.AnchorStyles.Left
         | System.Windows.Forms.AnchorStyles.Right;
         this._tableLayoutPanel.BackgroundImage = global::Test_Graphic.Properties.Resources.setup;
         this._tableLayoutPanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
         this._tableLayoutPanel.ColumnCount = 2;
         this._tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Percent, 43.44704F));
         this._tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Percent, 56.55296F));
         this._tableLayoutPanel.Controls.Add(this._pBox, 0, 0);
         this._tableLayoutPanel.Location = new System.Drawing.Point(27, 30);
         this._tableLayoutPanel.Name = "tableLayoutPanel1";
         this._tableLayoutPanel.RowCount = 2;
         this._tableLayoutPanel.RowStyles.Add(newRowStyle(System.Windows.Forms.SizeType.Percent, 50F));
         this._tableLayoutPanel.RowStyles.Add(newRowStyle(System.Windows.Forms.SizeType.Percent, 50F));
         this._tableLayoutPanel.Size = new System.Drawing.Size(542, 383);
         this._tableLayoutPanel.TabIndex = 8;
         this._tableLayoutPanel.ResumeLayout(false);
         this.Controls.Add(this._tableLayoutPanel);
      }
   }
}

Voilà, essaye d'agrandir ta Form maintenant, ça marcheeeeee ;-)

VC# forever
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Bidou
leprov 1163 Messages postés vendredi 23 juillet 2004Date d'inscription 21 octobre 2010 Dernière intervention - 25 juil. 2006 à 23:00
0
Utile
je sais pas si ca va faire exactement ce que tu voudras, mais bon

docker un composant de chaque coté (pannel), et docker la picturebox en "fill" au millieu de tous les pannels
Commenter la réponse de leprov
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 25 juil. 2006 à 23:04
0
Utile
ou alors tu as aussi la propriété anchor de tes controls...

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Commenter la réponse de sebmafate
leprov 1163 Messages postés vendredi 23 juillet 2004Date d'inscription 21 octobre 2010 Dernière intervention - 25 juil. 2006 à 23:21
0
Utile
ah vi pas lhabitude dutiliser anchor, cest vrai....jy pense jamais...

bcp plus simple
Commenter la réponse de leprov
Tuizi 144 Messages postés samedi 21 octobre 2000Date d'inscription 7 mai 2009 Dernière intervention - 25 juil. 2006 à 23:24
0
Utile
Le truc c'est que l'utilisateur place par exemple son image où il veut sur la picturebox de fond.
Au début cette picturebox de fond est en SizeMode = Zoom, mais si on passe en AutoSize, il faut que la picturebox que l'utilisateur à placer où il voulé, s'agrandisse (ça c'est bon je l'ai fait) mais aussi qu'elle se mette aux coordonnés mise à l'echelle (la dessus je calle!).

Tuizi
Commenter la réponse de Tuizi
Tuizi 144 Messages postés samedi 21 octobre 2000Date d'inscription 7 mai 2009 Dernière intervention - 25 juil. 2006 à 23:31
0
Utile
Je n'arrive pas à voir comment la propriété Anchor marche, j'ai cliqué sur les 4 cotés pour voir, et là ça ne me déplace pas mon image ça m'agrandit la picturebox!!! :s

Tuizi
Commenter la réponse de Tuizi
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 25 juil. 2006 à 23:40
0
Utile
Salut,
Euh, je ne sais pas si c'est ce que tu veux, mais une idée :

- S'abonner à l'event déclencher lors du resize
- Chercher si l'agrandissement a été plus grand en largeur ou hauteur
- Ajuster la largeur respectivement la hauteur en fonction du plus grand

VC# forever
Commenter la réponse de cs_Bidou
Tuizi 144 Messages postés samedi 21 octobre 2000Date d'inscription 7 mai 2009 Dernière intervention - 25 juil. 2006 à 23:48
0
Utile
Sniff Bidou, c'est ce que je fais en ce moment et je me casse vraiment la tete dessus, donc je voudrais savoir si il y a pas un moyen de le faire automatiquement avant de me replonger dans les calculs

Tuizi
Commenter la réponse de Tuizi
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 26 juil. 2006 à 09:32
0
Utile
Des calculs? Quels calculs?
Récupérer le plus grand, c'est sans calcul, suffit de contrôler les valeurs de Height et Width de ton image...

Ensuite, c'est une simple règle de trois : si x1 et y1 sont les valeurs de la lageur et hauteur de ton image et x2 et y2 les nouvelles valeurs, alors
 
si x2 > y2 : y2 = y1 * (x2 / x1)

si y2 > x2:  x2 = x1 * (y2 / y1)

si x2 = y2 : tu choisis un des deux cas plus haut aléatoirement

VC# forever
Commenter la réponse de cs_Bidou
Tuizi 144 Messages postés samedi 21 octobre 2000Date d'inscription 7 mai 2009 Dernière intervention - 26 juil. 2006 à 13:06
0
Utile
Bidou c'est pour la taille que tu me donne ce principe?


Moi c'est surtout pour la position en faite, le principe que j'ai établit et qui ne marche pas fort c'est:


Je regarde le pourcentage d'agrandissement en largeur de mon image de fond, et j'applique ce poucentage sur la Position X de l'image qui est placé dessus.

Donc c'est pour ça que j'aimerai savoir si il y a une méthode qui fait ça en C#

Merci de vos réponses en tout cas

Tuizi
Commenter la réponse de Tuizi
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 26 juil. 2006 à 14:29
0
Utile
Il semblerait qu'on ne parle pas de la même chose
J'ai peut-être pas bien compris la question...

VC# forever
Commenter la réponse de cs_Bidou
Tuizi 144 Messages postés samedi 21 octobre 2000Date d'inscription 7 mai 2009 Dernière intervention - 26 juil. 2006 à 14:52
0
Utile
Erf, je m'en douté que ma question été pas forcément clair, je retente :
En faite, sur une image par exemple de 1000x1000, au début elle est en SizeMode Zoom, donc sa taille on va dire fait 500x500, là dessus je met une autre picturebox au coordonné 5:5, donc on est d'accord qu'a ce moment là si je repasse en SizeMode Autosize, j'ai donc mon image qui a doublé.

Donc normal, je double aussi la taille de l'image coller par dessus (pour l'echelle) mais aussi ça position. Et c'est donc la que je coince, je voudrais faire un truc propre donc voir si une métohde ou une propriété le fait

Tuizi
Commenter la réponse de Tuizi
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 28 juil. 2006 à 10:27
0
Utile
Franchement, je visualise pas très bien.
Tu m'envoyer ton projet par e-Mail si tu veux, histoire que je vois de quoi ça parle

VC# forever
Commenter la réponse de cs_Bidou
Tuizi 144 Messages postés samedi 21 octobre 2000Date d'inscription 7 mai 2009 Dernière intervention - 28 juil. 2006 à 16:30
0
Utile
Non je ne peux pas fournir le projet Bidou, désolé.

J'ai réussit a faire ce que je voulais malgrès un manque de précision dans les calculs, mais Bidou je vais prendre un exemple concret:

Tu vois par exemple dans internet explorer, les boutons genre "Réponse acceptée" (:p) quand tu agrandis ta fenetre ou que tu la resize, et bien il reste a l'echelle, si en taille réduite ils sont place au 3/4 de la page est bien quand la page va etre agrandit le bouton va rester au 3/4 de la page.

Tuizi
Commenter la réponse de Tuizi
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 28 juil. 2006 à 19:50
0
Utile
Je ne suis pas sur de ce que tu veux.
Si tu créer une nouvelle form (taille 300; 300), tu mets un bouton en (150; 150).

Le but, c'est quoi? Si j'agrandis la form, il doit s'accrocher à un côté? C'est à dire par exemple rester à x pixel du bas de la fenetre, et y pixel de la droite, ou bien il doit garder la proportion? C'est à dire que s'il se trouvait à (150; 150) sur une fenetre de (300; 300) il doit se trouver à (400; 400) sur une fenetre de (800; 800) ?

Si t'es dans le premier cas, tu fais un anchor right, bottom.
Si t'es dans le second cas, faut calculer la position avant le resize, trouver la proportionnalité sur x et y (ici elle vaut 300/150 pour x et 300/150 sur y; c'est à dire 2 dans les deux cas) puis regarder la nouvelle grandeur à la fin du resize et faire le calcul à l'envers [nouvelles grandeur (800; 800) => (800/2; 800/2) => (400;400)]. Un peu moins facile à mettre en place...

VC# forever
Commenter la réponse de cs_Bidou
Tuizi 144 Messages postés samedi 21 octobre 2000Date d'inscription 7 mai 2009 Dernière intervention - 29 juil. 2006 à 14:25
0
Utile
Voila Bidou, c'est le 2nd cas que je veux faire. Et donc oui j'ai du faire comme dit au message précédent les calculs que tu dis. Mais je perd de la précision de 2 ou 3 pixel, j'utilise pourtant du decimal mais bon c'est pas grave cela fait ce que je veux.

Mais donc j'aurai juste voulu savoir si y'avait une méthode ou une propriété qui fait ça automatiquement mais on dirait que non... tans pis ça me convient là mon truc :)

Tuizi
Commenter la réponse de Tuizi
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 29 juil. 2006 à 15:04
0
Utile
Alors si tu travailles en .NET2, je pense que tu devrais pouvoir résoudre le problème assez proprement :
Pour cela, jettes un oeil du côté des Containers. Par exemple, avec un TableLayoutPanel j'ai réussi à faire ce que j'ai décrit ci-dessus sans ancun calcul...

VC# forever
Commenter la réponse de cs_Bidou
Tuizi 144 Messages postés samedi 21 octobre 2000Date d'inscription 7 mai 2009 Dernière intervention - 30 juil. 2006 à 17:51
0
Utile
J'essaye...


Interessant mais sa marche comment? J'ai mis un bouton dedans histoire de comprendre, j'ai essayer avec la propriété Anchor voir si il pouvez ce déplacer en fonction du redimentionnement mais rien... :s

Tuizi
Commenter la réponse de Tuizi
Tuizi 144 Messages postés samedi 21 octobre 2000Date d'inscription 7 mai 2009 Dernière intervention - 30 juil. 2006 à 17:51
0
Utile
La propriété Dock par Anchor, je me suis tropé :)

Tuizi
Commenter la réponse de Tuizi
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 30 juil. 2006 à 18:09
0
Utile
Euh, tu poses un TableLayoutPanel sur ta form (la il te créer par défaut 4 quadrants) tu poses un bouton sur la cardrant tout en bas à droite par exemple, et c'est tout sauf erreur !

VC# forever
Commenter la réponse de cs_Bidou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Garder l'echelle lors d'un resize - page 2