Garder l'echelle lors d'un resize

Résolu
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009 - 25 juil. 2006 à 20:02
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009 - 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

36 réponses

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
25 juil. 2006 à 23:00
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
1
cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
15 août 2006 à 18:54
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
1
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
25 juil. 2006 à 23:04
ou alors tu as aussi la propriété anchor de tes controls...

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

bcp plus simple
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009
25 juil. 2006 à 23:24
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
0
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009
25 juil. 2006 à 23:31
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
0
cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
25 juil. 2006 à 23:40
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
0
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009
25 juil. 2006 à 23:48
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
0
cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 juil. 2006 à 09:32
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
0
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009
26 juil. 2006 à 13:06
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
0
cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 juil. 2006 à 14:29
Il semblerait qu'on ne parle pas de la même chose
J'ai peut-être pas bien compris la question...

VC# forever
0
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009
26 juil. 2006 à 14:52
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
0
cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
28 juil. 2006 à 10:27
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
0
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009
28 juil. 2006 à 16:30
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
0
cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
28 juil. 2006 à 19:50
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
0
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009
29 juil. 2006 à 14:25
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
0
cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
29 juil. 2006 à 15:04
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
0
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009
30 juil. 2006 à 17:51
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
0
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009
30 juil. 2006 à 17:51
La propriété Dock par Anchor, je me suis tropé :)

Tuizi
0
cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
30 juil. 2006 à 18:09
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
0
Rejoignez-nous